超时后如何杀死Elixir过程

树篱

如何启动Elixir进程,然后在超时后将其杀死?我有这样的代码:

defmodule OperationsManager do
  def run_operation do
    spawn fn -> 
      # long operation 
    end
  end
end

内部操作可能持续太长时间以至于无法等待其结束,因此我需要从管理器中终止该过程。我该怎么做?

编辑:

重要细节:我需要产生多个操作,并且所有这些操作都应具有单独的超时。

stephen_m

我来看看Elixir Task模块

您可以在给定的时间间隔内使用一个Task.yield或多个任务来处理单个任务Task.yield_many,尽管Task.yield看起来更接近您的需要。收益回报{:ok, result}(成功回报),{:exit, reason}(任务崩溃)或:nil(超过超时间隔)。您也可以考虑将任务放在监管树中。

以下代码基于elixir 1.2.1。

defmodule OperationsManager do
  def run_operation() do

    task1 = Task.async(fn() -> operation("task 1", 1) end)
    result = Task.yield(task1, 5000)
    process_task(task1, result)

    task2 = Task.async(fn() -> operation("task 2", 2) end)
    task4 = Task.async(fn() -> operation("task 4", 4) end)
    task6 = Task.async(fn() -> operation("task 6", 6) end)
    task8 = Task.async(fn() -> operation("task 8", 8) end)

    results = Task.yield_many([task2, task4, task6, task8], 7000)
    for {task, res} <- results do
      process_task(task, res)
    end

  end

  def process_task(task, res) do
    case res do
      :nil ->
        IO.write("shutting down timed out task: ")
        IO.inspect(task)
        Task.shutdown(task, :brutal_kill)
      {:ok, task_number} ->
        IO.puts("#{task_number} is complete")
      {:exit, _reason} ->
        # some logic when the task terminates
    end
  end

  def operation(task_number, timeout) do
    :timer.sleep(timeout * 1000)
    task_number
  end

end


OperationsManager.run_operation()

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Linux

在Bash中给定超时后如何杀死子进程?

来自分类Dev

Perl叉子并在超时后杀死孩子

来自分类Dev

如何杀死“等待安装”过程?

来自分类Dev

如何杀死 devops 上的进程(最好是超时)

来自分类Dev

超时后杀死长时间运行的查询

来自分类Dev

超时后杀死多个子进程的子进程?

来自分类Dev

如何杀死一个过时的过程

来自分类Dev

如何无害地杀死孩子的过程

来自分类Dev

Elixir / Phoenix:如何实现会话超时/过期

来自分类Dev

超时后如何取消线程

来自分类Dev

X时间后如何杀死Akka演员?

来自分类Dev

杀死线程后如何分配内存?

来自分类Dev

N秒后如何杀死线程?

来自分类Dev

从脚本执行后如何杀死程序?

来自分类Dev

我如何杀死一个前炸弹过程?

来自分类Dev

如何杀死一个按键触发的过程?

来自分类Dev

赛车过程组ID,如何杀死该组?

来自分类Dev

我如何创建一个难以杀死的过程

来自分类Dev

当酒过程崩溃或将要崩溃时,如何杀死它们?

来自分类Dev

如何使用过程杀死从Java代码调用它的作业?

来自分类Dev

杀死无响应的过程

来自分类Dev

“杀死最大的过程”按钮

来自分类Dev

管道左侧的杀死过程

来自分类Dev

芹菜杀死过程很麻烦

来自分类Dev

“杀死的过程”的说明

来自分类Dev

等待杀死过程

来自分类Dev

了解subprocess.TimeoutExpired,想要在发生超时后杀死子进程

来自分类Dev

Python 3:线程:由于超时而中止后杀死可调用的执行?

来自分类Dev

超时后如何使用JS播放youtube?