使用 python 中的 defer 模块异步执行一堆任务
Using defer module in python to execute a bunch of tasks async
我看到这个page建议使用 defer 模块异步执行一系列任务。
我想将它用于我的项目:
- 计算我拥有的每个数字列表的中位数(得到一个列表,包含数字列表)
- 获取所有中位数的最小和最大中位数。
但其实我也不太明白怎么用
我希望在 python 中得到一些关于延迟的解释,以及您是否认为这是实现我的目标的适当方式(考虑到全局解释器锁)。
提前致谢!
不,使用异步编程(合作例程,又名协程)对您的用例没有帮助。异步非常适合 I/O 密集型工作负载,或任何其他必须等待较慢的外部事件触发的情况。
协程之所以有效,是因为它们在必须等待某事(通常是某些 I/O 发生)时将控制权 (yield) 交给了其他协程。如果他们经常这样做,事件循环可以在 负载 协程之间交替,通常远远超过线程可以实现的,具有更简单的编程模型(不需要一直锁定数据结构).
但是您的用例并不等待 I/O;您有 计算量大的工作量。此类工作负载没有明显的让步位置,并且因为它们不需要等待外部事件,所以无论如何都没有理由这样做。对于这样的工作负载,使用 multiprocessing model 在不同的 CPU 核心上并行工作。
异步编程也没有击败 GIL,但确实给了事件循环机会,将 等待 I/O 部分移动到可以解锁的 C 代码GIL 并并行处理所有 I/O 处理,而其他 Python 代码(在不同的协程中)可以执行。
有关异步编程的详细介绍,请参阅 this talk by my colleague Łukasz Langa at PyCON 2016。
我看到这个page建议使用 defer 模块异步执行一系列任务。
我想将它用于我的项目:
- 计算我拥有的每个数字列表的中位数(得到一个列表,包含数字列表)
- 获取所有中位数的最小和最大中位数。
但其实我也不太明白怎么用
我希望在 python 中得到一些关于延迟的解释,以及您是否认为这是实现我的目标的适当方式(考虑到全局解释器锁)。
提前致谢!
不,使用异步编程(合作例程,又名协程)对您的用例没有帮助。异步非常适合 I/O 密集型工作负载,或任何其他必须等待较慢的外部事件触发的情况。
协程之所以有效,是因为它们在必须等待某事(通常是某些 I/O 发生)时将控制权 (yield) 交给了其他协程。如果他们经常这样做,事件循环可以在 负载 协程之间交替,通常远远超过线程可以实现的,具有更简单的编程模型(不需要一直锁定数据结构).
但是您的用例并不等待 I/O;您有 计算量大的工作量。此类工作负载没有明显的让步位置,并且因为它们不需要等待外部事件,所以无论如何都没有理由这样做。对于这样的工作负载,使用 multiprocessing model 在不同的 CPU 核心上并行工作。
异步编程也没有击败 GIL,但确实给了事件循环机会,将 等待 I/O 部分移动到可以解锁的 C 代码GIL 并并行处理所有 I/O 处理,而其他 Python 代码(在不同的协程中)可以执行。
有关异步编程的详细介绍,请参阅 this talk by my colleague Łukasz Langa at PyCON 2016。