从分布式dask中的线程池中分离任务

时间:2017-07-27 17:22:28

标签: python dask dask-distributed

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

  

但是,每个正在运行的任务占用一个线程,因此如果您启动许多启动其他任务的任务,那么如果您不小心,可能会使系统死锁。您可以从任务中调用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)

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

1 个答案:

答案 0 :(得分:1)

  

迁移到管理线程意味着什么?

Dask worker维护一个固定大小的线程池来运行任务。当您调用secede时,您的计算将离开此线程池,并打开另一个插槽,以便运行其他任务。你的任务的线程仍然存在,但只是一个普通的线程。术语"管理线程"除了"一个不在线程池中的线程"并不代表任何特别的东西。

  

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

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

  

管理线程确实有优先权吗?

没有

  

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

如果

,您应该致电secede
  1. 您可能会调用足够的任务来等待其他任务,这样任何任务都无法完成,因为所有线程池的线程都在等待其他插槽打开。
  2. 您不打算在该任务中做更多工作
  3. 如果

    ,则不应致电secede
    1. 在打电话secede后,您打算在任务中执行更多计算限制的工作。这仍然可以,但有些不礼貌,因为Dask会在没有任何限制的情况下轻松启动其中的几项任务。