绿色线程和Python中的线程



As维基百科状态

绿色线程在不依赖任何本机操作系统功能的情况下模拟多线程环境,并且它们在用户空间而不是内核空间中进行管理,使它们能够在没有本机线程支持的环境中工作。

Python的线程被实现为CCD_ 1,由于全局解释器锁(GIL),Python进程一次只运行一个线程。

[问题]但在Green-threads(或所谓的greenlet或tasklets)的情况下,

  1. GIL会影响它们吗?有不止一个绿绿灯吗一次跑步
  2. 使用greenlet或tasklet有哪些陷阱
  3. 如果我使用greenlet,一个流程可以处理多少个greenlet?(我想知道,因为在一个进程中,您可以打开多达ulimit(-s-v)设置在您的*ix系统中。)

我需要一点洞察力,如果有人能分享他们的经验,或引导我走上正确的道路,这将有所帮助。

您可以将greenlet看作更像协作线程。这意味着,在任何给定的时刻,都没有调度程序在线程之间先发制人地切换——相反,您的greenlet会在代码中的指定点自愿/明确地将控制权交给彼此。

GIL会影响他们吗?能有不止一个新手在跑步吗一次?

一次只运行一个代码路径-优点是您可以最终控制哪一个。

使用greenlet或tasklet有哪些陷阱?

您需要更加小心-一个写得不好的greenlet不会将控制权交给其他greenlet。另一方面,由于您知道greenlet何时会上下文切换,因此您可以通过而不是为共享数据结构创建锁。

如果我使用greenlet,一个进程可以处理多少个greenlet?(我想知道,因为在一个进程中,你可以打开线程,达到你的*ix系统中设置的umask限制。)

对于常规线程,您拥有的调度程序开销越多。此外,常规线程仍然具有相对较高的上下文切换开销。Greenlets没有这些开销。来自瓶子文档:

大多数服务器将其工作池的大小限制在相对较低的并发线程数,这是由于在线程之间切换并创建新线程。虽然螺纹很便宜与流程(fork)相比,它们的创建成本仍然很高每个新连接。

gevent模块为混合添加了greenlets。Greenlets表现相似到传统线程,但创建起来非常便宜。基于gevent服务器可以生成数千个greenlet(每个连接一个)几乎没有开销。阻止单个绿地对服务器接受新请求的能力。并发次数连接实际上是无限的。

如果您感兴趣,这里还有一些进一步的阅读:http://sdiehl.github.io/gevent-tutorial/

我想你说的是evelet/gevent greenlets

1) 只有一个绿绿灯在运行

2) 它是协作多线程,这意味着如果一个greenlet被困在一个无限循环中,那么整个程序就会被卡住,通常greenlet是显式调度的,或者在I/O 期间调度的

3) 比线程多得多,这取决于可用RAM的数量

相关内容

  • 没有找到相关文章

最新更新