微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 Julia 的“Distributed.interrupt”会终止工作进程?

如何解决为什么 Julia 的“Distributed.interrupt”会终止工作进程?

我对函数 Distributed.interrupt() 的作用感到困惑。文档说它会“中断指定工作人员的当前执行任务”,但它似乎也会终止工作人员。

示例:

using distributed

addprocs(1)  # Adding one local worker 
my_worker = workers()[1]

# Check number of processes
println("Processes: ",nprocs())

# Define a function
@everywhere function just_sleep(time)
    println("Sleeping...")
    sleep(time)
end

# Execute on the worker
remote_do(just_sleep,my_worker,100)

# Wait a bit and interrupt
sleep(5)
interrupt(my_worker)

# Check number of processes again
sleep(5)
println("Processes: ",nprocs())

我得到这个输出

> julia testing.jl
Processes: 2
      From worker 2:    Sleeping...
Worker 2 terminated.
Processes: 1

我希望工作进程 #2 仍然活着,并且最后的进程数量仍然是两个。它甚至没有帮助向 just_sleep() 的主体添加异常处理:

function just_sleep(time)
    println("Sleeping...")
    try
        sleep(time)
    catch e
        if isa(e,InterruptException)
            println("interrupted")
        else
            println(e)
        end
    end
end

现在 interrupt() 似乎表现得像 distributed.rmprocs()。我在 Windows 10 上安装了 Julia 1.5.3。


编辑

我也在 WSL Ubuntu 上尝试过。有更多信息,但工人也被终止

Processes: 2
      From worker 2:    Sleeping...
      From worker 2:    fatal: error thrown and no exception handler available.
      From worker 2:    InterruptException()
      From worker 2:    jl_mutex_unlock at /buildworker/worker/package_linux64/build/src/locks.h:144 [inlined]
      From worker 2:    jl_task_get_next at /buildworker/worker/package_linux64/build/src/partr.c:476
      From worker 2:    poptask at ./task.jl:704
      From worker 2:    wait at ./task.jl:712 [inlined]
      From worker 2:    task_done_hook at ./task.jl:442
      From worker 2:    _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2214 [inlined]
      From worker 2:    jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2398
      From worker 2:    jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1690 [inlined]
Worker 2 terminated.      From worker 2:        jl_finish_task at /buildworker/worker/package_linux64/build/src/task.c:196

      From worker 2:    start_task at /buildworker/worker/package_linux64/build/src/task.c:715
      From worker 2:    unkNown function (ip: (nil))
Processes: 1

有趣的是,它适用于交互式 REPL 会话(仅适用于 Linux):

Processes: 2
workers() = [2]
      From worker 2:    Sleeping for 100 s...
      From worker 2:    interrupted!
Processes: 2
workers() = [2]
1-element Array{Int64,1}:
 2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。