线程和Python中的线程
正如维基百科所述 :
绿色线程模拟多线程环境而不依赖任何本机操作系统功能,并且它们在用户空间而不是内核空间中进行管理,从而使它们能够在没有本地线程支持的环境中工作。
Python的线程被实现为pthreads (kernel threads)
,并且由于全局解释器锁定(GIL),Python进程一次只能运行一个线程。
[ 问题 ]但是在Green-threads
(或所谓的greenlet或tasklet)的情况下,
GIL
会影响他们吗? 一次可以运行多个greenlet吗? 我需要一点洞察力,如果有人能够分享他们的经验,或引导我走向正确的道路,这将有所帮助。
你可以更像合作线程来思考greenlet。 这意味着在任何时候都没有调度程序在您的线程之间先发制人地切换 - 相反,您的greenlet会自动/明确地在您的代码中指定的点放弃控制。
GIL会影响他们吗? 一次可以运行多个greenlet吗?
一次只能运行一条代码路径 - 优点是您可以最终控制哪个代码路径。
使用greenlet或tasklets有哪些缺陷?
你需要更加小心 - 一个写得不好的greenlet不会对其他greenlet产生控制。 另一方面,由于您知道greenlet何时会进行上下文切换,因此您可能无法为共享数据结构创建锁定。
如果我使用greenlet,一个进程可以处理多少个? (我想知道,因为在一个过程中,您可以打开线程,直到在* ix系统中设置umask限制。)
使用常规线程时,您拥有的调度程序开销越多。 普通线程仍然具有较高的上下文切换开销。 Greenlet没有与他们相关的开销。 从瓶子文档:
由于涉及切换和创建新线程的高开销,大多数服务器将其工作池的大小限制为相对较少的并发线程数。 虽然线程比进程(fork)便宜,但为每个新连接创建它们仍然很昂贵。
gevent模块为混合添加了greenlet。 Greenlets的行为类似于传统的线程,但创建起来非常便宜。 基于gevent的服务器可以产生数千个greenlet(每个连接一个),几乎没有开销。 阻止个别greenlet对服务器接受新请求的能力没有影响。 并发连接的数量几乎是无限的。
如果您有兴趣,还可以阅读更多内容:http://sdiehl.github.io/gevent-tutorial/
我假设你在谈论evenlet / gevent greenlets
1)只能运行一个greenlet
2)它是合作多线程,这意味着如果greenlet陷入无限循环,整个程序就会停滞不前,通常greenlets会显式调度或在I / O
3)比线程多得多,这取决于可用RAM的数量
链接地址: http://www.djcxy.com/p/86481.html上一篇: threads and thread in Python
下一篇: Django raising ValueError: invalid literal for int() with base 10 on POST