绿色与线程

我对gevents和greenlets不熟悉。我找到了一些关于如何使用它们的好文档,但是没有一个文档能够证明我应该如何以及何时使用greenlet

  • 他们真正擅长什么
  • 在代理服务器中使用它们是否是一个好主意
  • 为什么不是线程

我不确定的是,如果它们基本上是联合例程,那么它们如何为我们提供并发性

greenlet提供并发性,但不提供并行性。并发性是指代码可以独立于其他代码运行。并行性是并发代码的同时执行。当在用户空间中有大量工作要做时,并行性尤其有用,而这通常是CPU密集型的工作。并发性有助于分解问题,使不同的部分能够更容易地并行调度和管理

Greenlets在网络编程中大放异彩,其中与一个套接字的交互可以独立于与其他套接字的交互而发生。这是并发的一个经典示例。因为每个greenlet都在自己的上下文中运行,所以您可以继续使用同步API而无需线程。这是很好的,因为线程在虚拟内存和内核开销方面非常昂贵,因此使用线程可以实现的并发性要少得多。此外,由于GIL,Python中的线程比通常更昂贵,也更有限。并发的替代方案通常是Twisted、libevent、libuv、node.js等项目,其中所有代码共享相同的执行上下文,并注册事件处理程序

使用greenlet(通过gevent等适当的网络支持)编写代理是一个很好的主意,因为您可以独立执行请求的处理,并且应该这样编写

基于我前面给出的原因,greenlet提供了并发性。并发性不是并行性。通过隐藏事件注册并对通常会阻止当前线程的调用执行调度,像gevent这样的项目可以在不需要更改异步API的情况下公开这种并发性,并且对系统的成本要低得多

  • 并发不是并行
  • 线程与进程
  • 多处理与线程
  • 吉尔对斯皮顿

发表评论