As维基百科状态:
绿色线程在不依赖任何本机操作系统功能的情况下模拟多线程环境,并且它们在用户空间而不是内核空间中进行管理,使它们能够在没有本机线程支持的环境中工作。
Python的线程被实现为CCD_ 1,由于全局解释器锁(GIL),Python进程一次只运行一个线程。
[问题]但在Green-threads
(或所谓的greenlet或tasklets)的情况下,
GIL
会影响它们吗?有不止一个绿绿灯吗一次跑步- 使用greenlet或tasklet有哪些陷阱
- 如果我使用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的数量