1

我一直在阅读有关从工作人员上运行的任务中生成新进程的文档。我从这里遇到了这个:

但是,每个正在运行的任务都占用一个线程,因此如果您启动了许多启动其他任务的任务,那么如果您不小心,可能会导致系统死锁。您可以从任务中调用 secede 函数,以将其从专用线程池中移除到不占用 Dask worker 中的插槽的管理线程中

转移到管理线程是什么意思?是否所有插槽都具有相同的优先级或类似的东西?并且管理线程确实有优先权?

作为一个具体的例子,这是我想尝试的:

from dask.distributed import get_client, secede

def compute_square(x):
    # Get locally created client
    client = get_client()
    secede()  # or not?
    if x > 5:
        client.submit(lambda x : x**2, x)

wherecompute_square和该lambda函数可能会运行很多次,并且将是一个计算量更大的函数,值得提交作业的 1ms 开销。我应该secede在这种情况下使用吗?

4

1 回答 1

2

转移到管理线程是什么意思?

Dask 工作人员为运行任务维护一个固定大小的线程池。当你调用secede你的计算时,你的计算会离开这个线程池,并为其他任务打开另一个槽来运行。您的任务线程仍然存在,但只是一个普通线程。术语“管理线程”除了“不在线程池中的线程”之外没有任何特别的含义。

是否所有插槽都具有相同的优先级或类似的东西?

一旦任务运行,它们之间就没有优先级。它们都在没有优先级的普通 Python 线程中运行。

并且管理线程确实有优先权?

在这种情况下我应该使用 secede 吗?

secede如果你应该打电话

  1. 您可能会调用足够多的任务,而这些任务都在等待其他任务,因此没有任务可以完成,因为您的线程池的所有线程都在等待其他插槽打开。
  2. 您不打算在该任务中做更多的工作

secede如果你不应该打电话

  1. 您打算在调用secede. 这仍然可以,但有点不礼貌,因为 Dask 会在没有任何限制的情况下轻松启动其中的几个任务。
于 2017-07-27T17:37:39.690 回答