绿色线程模拟多线程环境,而不依赖于任何本机操作系统功能,它们在用户空间而不是内核空间中进行管理,使它们能够在没有本机线程支持的环境中工作。
Python的线程实现为pthreads (kernel threads)
,
并且由于全局解释器锁(GIL),Python进程一次只运行一个线程。
[问题]
但是在Green-threads
(或所谓的greenlet或tasklet)的情况下,
GIL
会影响他们吗?可以有多个greenlet 一次跑?- 使用greenlet或tasklet有哪些缺陷?
- 如果我使用greenlet,进程可以处理多少个? (我想知道,因为在一个过程中你可以打开线程 您的* ix系统中设置了 ulimit ( -s , -v )。)
醇>
我需要一点见解,如果有人可以分享他们的经验,或者引导我走上正确的道路,那将会有所帮助。
答案 0 :(得分:18)
你可以认为greenlets更像是合作线程。这意味着在任何给定时刻都没有调度程序在您的线程之间进行预先切换 - 相反,您的greenlet会自动/明确地在代码中的指定点放弃对彼此的控制。
GIL会影响他们吗?可以运行多个greenlet吗? 一次?
一次只运行一个代码路径 - 优点是您可以最终控制哪个代码路径。
使用greenlet或tasklet有哪些缺陷?
你需要更加小心 - 一个写得不好的greenlet不会控制其他greenlets。另一方面,由于您知道greenlet何时会进行上下文切换,因此您可以使用而不是为共享数据结构创建锁定。
如果我使用greenlet,进程可以处理多少个? (我想知道,因为在一个过程中你可以打开你的* ix系统中设置的umask限制线程。)
使用常规线程,您拥有的调度程序开销越多。常规线程仍然具有相对较高的上下文切换开销。 Greenlets没有与它们相关的开销。来自bottle documentation:
大多数服务器将其工作池的大小限制为相对较低 并发线程数,由于涉及的高开销 切换和创建新线程。线程便宜 与流程(forks)相比,它们的创建成本仍然很高 每个新的连接。
gevent模块将greenlet添加到混合中。 Greenlets表现相似 传统的线程,但创建起来非常便宜。以gevent为基础 服务器可以生成数千个greenlet(每个连接一个) 几乎没有开销。阻止个体greenlets没有影响 服务器接受新请求的能力。并发数 连接几乎是无限的。
如果您有兴趣,还可以在这里进一步阅读: http://sdiehl.github.io/gevent-tutorial/
答案 1 :(得分:4)
我假设你在谈论的是evenlet / gevent greenlets
1)只能运行一个greenlet
2)这是合作多线程,这意味着如果greenlet卡在无限循环中,整个程序都会被卡住,通常是明确地或在I / O期间安排greenlet
3)比线程多得多,这取决于可用的RAM量