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

Python 为什么线程化dask示例并行执行,python,python-3.x,multithreading,dask,dask-delayed,Python,Python 3.x,Multithreading,Dask,Dask Delayed,出于教学目的,我尝试使用daskdelayed创建简单的示例,在使用线程而不是进程时突出显示GIL。我现在使用单机调度器来保持简单。我的理解是,从单线程切换到线程不会有任何变化,因为GIL应该阻止并行执行 事实并非如此。当我使用threaded选项时,代码的运行速度仍然与进程的运行速度一样快(实际上更快)(单线程=3s,线程=1s,进程=1.7s)。这三个延迟的调用基本上是同时执行的 很明显,我没有我想象的那么清楚发生了什么。有人能解释一下这是怎么回事吗?为什么GIL没有用线程锁定我的计算 导入

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

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

很明显,我没有我想象的那么清楚发生了什么。有人能解释一下这是怎么回事吗?为什么GIL没有用线程锁定我的计算

导入时间
进口达斯克
从dask导入延迟
def func(一):
导入时间
打印(f'函数{i:.0f}正在启动')
时间。睡眠(1)
打印(f'函数{i:.0f}已完成')
lazy=[范围(3)内i的延迟(func)(i)]
使用dask.config.set(scheduler='processes'):#单线程,进程或线程
开始=时间。时间()
dask.compute(惰性)
elaps=time.time()-开始
打印(elaps)

答案非常简单:
sleep()
没有GIL,因为没有什么可以做。您需要设计一些真正的“工作”来锁定线程并降低并行性。

答案非常简单:
sleep()
无法控制GIL,因为没有什么可以做的。您需要设计一些真正的“工作”来锁定线程并降低并行性。

啊,答对了!我刚从一位同事那里得到了同样的答案。我将我的函数改为使用while循环倒计时,该示例现在可以运行了。谢谢。:)啊,宾果!我刚从一位同事那里得到了同样的答案。我将我的函数改为使用while循环倒计时,该示例现在可以运行了。谢谢。:)