我一直在阅读有关在工作人员上运行的任务中生成新进程的文档。我从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_square
和lambda
函数可能会运行很多次,并且是一个计算量更大的函数,值得提交作业的1ms开销。
在这种情况下我应该使用secede
吗?
答案 0 :(得分:1)
迁移到管理线程意味着什么?
Dask worker维护一个固定大小的线程池来运行任务。当您调用secede
时,您的计算将离开此线程池,并打开另一个插槽,以便运行其他任务。你的任务的线程仍然存在,但只是一个普通的线程。术语"管理线程"除了"一个不在线程池中的线程"并不代表任何特别的东西。
是否所有插槽都具有相同的优先级或类似的东西?
一旦任务正在运行,它们之间就没有优先权。它们都在普通的Python线程中运行,没有优先级。
管理线程确实有优先权吗?
没有
在这种情况下我应该使用secede吗?
如果
,您应该致电secede
如果
,则不应致电secede
secede
后,您打算在任务中执行更多计算限制的工作。这仍然可以,但有些不礼貌,因为Dask会在没有任何限制的情况下轻松启动其中的几项任务。