我对gevents和greenlets不熟悉。我找到了一些关于如何使用它们的好文档,但是没有一个文档能够证明我应该如何以及何时使用greenlet
- 他们真正擅长什么
- 在代理服务器中使用它们是否是一个好主意
- 为什么不是线程
我不确定的是,如果它们基本上是联合例程,那么它们如何为我们提供并发性
greenlet提供并发性,但不提供并行性。并发性是指代码可以独立于其他代码运行。并行性是并发代码的同时执行。当在用户空间中有大量工作要做时,并行性尤其有用,而这通常是CPU密集型的工作。并发性有助于分解问题,使不同的部分能够更容易地并行调度和管理
Greenlets在网络编程中大放异彩,其中与一个套接字的交互可以独立于与其他套接字的交互而发生。这是并发的一个经典示例。因为每个greenlet都在自己的上下文中运行,所以您可以继续使用同步API而无需线程。这是很好的,因为线程在虚拟内存和内核开销方面非常昂贵,因此使用线程可以实现的并发性要少得多。此外,由于GIL,Python中的线程比通常更昂贵,也更有限。并发的替代方案通常是Twisted、libevent、libuv、node.js等项目,其中所有代码共享相同的执行上下文,并注册事件处理程序
使用greenlet(通过gevent等适当的网络支持)编写代理是一个很好的主意,因为您可以独立执行请求的处理,并且应该这样编写
基于我前面给出的原因,greenlet提供了并发性。并发性不是并行性。通过隐藏事件注册并对通常会阻止当前线程的调用执行调度,像gevent这样的项目可以在不需要更改异步API的情况下公开这种并发性,并且对系统的成本要低得多
- 并发不是并行
- 线程与进程
- 多处理与线程
- 吉尔对斯皮顿