出于教学目的,我试图使用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)
答案 0 :(得分:2)
答案非常简单:sleep()
不保存GIL,因为没有任何事情可做。您需要设计一些实际的“工作”以锁定线程并降低并行度。