为什么线程dask示例并行执行

时间:2019-08-27 16:49:41

标签: python python-3.x multithreading dask dask-delayed

出于教学目的,我试图使用dask delay创建简单的示例,这些示例在使用线程而不是进程时突出显示GIL。我现在使用单机调度程序来使事情保持简单。我的理解是,从单线程切换到线程不会有任何变化,因为GIL应该阻止事物并行执行。

事实并非如此。当我使用threaded选项时,代码的运行速度(实际上更快)仍然比processes快(单线程= 3s,线程= 1s,进程= 1.7s)。这三个延迟的调用基本上是同时执行的。

很显然,我不了解我所想的。有人可以解释这是怎么回事吗?为什么GIL没有用线程锁定我的计算?

import time
import dask
from dask import delayed


def func(i):
    import time
    print(f'Function {i:.0f} starting')
    time.sleep(1)
    print(f'Function {i:.0f} finished')


lazy = [delayed(func)(i) for i in range(3)]
with dask.config.set(scheduler='processes'):  # single-threaded, processes or threads
    start = time.time()
    dask.compute(lazy)
    elaps = time.time() - start
    print(elaps)

1 个答案:

答案 0 :(得分:2)

答案非常简单:sleep()不保存GIL,因为没有任何事情可做。您需要设计一些实际的“工作”以锁定线程并降低并行度。