在python中使用defer模块执行一堆异步任务

时间:2017-05-30 06:32:12

标签: python asynchronous deferred gil

我看到这个page建议使用延迟模块来异步执行一系列任务。

我想将它用于我的项目:

  1. 计算我拥有的每个数字列表的中位数(有一个列表,包含数字列表)
  2. 获取所有中位数的最低和最高中位数。
  3. 但事实上,我不太明白如何使用它。

    我希望能有一些关于延迟python的解释,以及你是否认为这是实现我的目标的合适方式(考虑全球解释器锁)。

    提前致谢!

1 个答案:

答案 0 :(得分:1)

不,使用异步编程(协作例程,也就是协同程序),对您的用例没有帮助。 Async非常适合 I / O密集型工作负载,或其他任何需要等待较慢的外部事件才能触发的事件。

协同程序的工作原理是因为只要等待某些东西(通常用于某些I / O),它们就会放弃对其他协同程序的控制( yield )。如果他们经常这样做,事件循环可以在协同程序的加载之间交替,通常远远超过线程可以实现的,使用更简单的编程模型(不需要一直锁定数据结构)。 / p>

您的用例不是在等待I / O;你有计算量很大的工作量。这样的工作负载没有明显的产出空间,并且因为它们不需要等待外部事件,所以无论如何都没有理由这样做。对于此类工作负载,请使用multiprocessing model在不同的CPU内核上并行工作。

异步编程也没有击败GIL,但确实给事件循环提供了将等待I / O 部分移动到可以解锁GIL并处理所有I / C的C代码的机会。 O并行处理,而其他Python代码(在不同的协程中)可以执行。

有关异步编程的详细介绍,请参阅this talk by my colleague Łukasz Langa at PyCON 2016