Python多进程与Eventlet的比较

7

根据我的理解,线程无法并行执行(只能基于可用性和随机执行),这就是为什么要使用Eventlet的原因。

如果Eventlet更多地用于并行,为什么不能直接使用Python的multiprocessing模块呢?

我考虑过执行多进程模块并使用join()方法来检查所有进程是否完成,不知道我的理解是否正确?


1
我可能错了,但从我读到的Eventlet(以前从未听说过,谢谢你的提示)来看,它执行非阻塞IO,因此允许执行流从池中的一个操作传递到下一个操作。虽然在CPython中线程由于GIL而无法并行运行,但下一个线程可以在一个线程在IO操作上被阻塞时运行。因此理论上不应该有太大的区别(除了编程的便利性)。请问有人能确认/纠正我的思路吗? - Pynchia
1个回答

2
根据我的理解,线程不能并行执行(基于可用性和随机性执行)。
正确。
这就是Eventlet被使用的原因。
不太正确。 Eventlet库用于简化非阻塞IO编程。它实际上并没有增加并行性。由于GIL的存在,线程执行仍然限制为一次一个线程。但是,它被使用是因为它大大简化了启动、调度和管理IO绑定线程的过程,特别是那些不需要相互交互的线程。
如果Eventlets更适合并行处理呢?
正如我刚才提到的,它们的存在并不是为了这个。
那么为什么我们不能只使用Python的多进程模块呢?我想执行多处理模块并使用join()方法来检查是否所有进程都已完成。
你当然可以!这样做会得到真正的并行执行。但是你可能无法获得相同的加速效果。multiprocessing库更适用于CPU密集型并行任务,因为这些任务需要更频繁地访问解释器。当使用multiprocessing处理IO绑定任务时,由于多个进程执行和管理的开销,实际上可能会看到执行时间的增加。
像大多数优化和执行时间问题一样,尝试两种方式并进行分析是确保您为应用程序使用“最佳”选项的可靠方法。虽然你可能会发现,如果你首先编写利用Eventlets的代码,然后尝试修改它以使用常规线程或多进程,你将不得不编写更多的样板代码来管理线程或进程,并且Eventlets的价值应该变得更加明显。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接