Python中的绿色线程和线程

Rah*_*tam 40 python multithreading pthreads gil green-threads

正如维基百科所述:

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

Python的线程实现为pthreads (kernel threads),并且由于全局解释器锁(GIL),Python进程一次只运行一个线程.

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

  1. GIL会影响他们吗?一次可以运行多个greenlet吗?
  2. 使用greenlets或tasklet的缺陷是什么?
  3. 如果我使用greenlet,进程可以处理多少个?(我想知道,因为在一个进程中你可以打开你的*ix系统中设置的ulimit(-s,-v)线程 .)

我需要一点见解,如果有人可以分享他们的经验,或者引导我走上正确的道路,那将会有所帮助.

Mar*_*cny 20

您可以将greenlet视为协作线程.这意味着在任何给定时刻都没有调度程序在您的线程之间进行预先切换 - 而是您的greenlets在代码中的指定点自愿/明确地放弃对彼此的控制.

GIL会影响他们吗?一次可以运行多个greenlet吗?

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

使用greenlets或tasklet的缺陷是什么?

你需要更加小心 - 一个写得不好的greenlet不会控制其他greenlets.在另一方面,因为你知道,当一个greenlet意志上下文切换,你可以用脱身创建共享数据结构的锁.

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

使用常规线程,您拥有的调度程序开销就越多.常规线程仍然具有相对较高的上下文切换开销.Greenlets没有与它们相关的开销.从瓶子文件:

由于在切换和创建新线程之间涉及高开销,大多数服务器将其工作池的大小限制为相对较少的并发线程数.虽然与进程(fork)相比线程便宜,但是为每个新连接创建它们仍然很昂贵.

gevent模块将greenlet添加到混合中.Greenlets的行为类似于传统的线程,但创建起来非常便宜.基于gevent的服务器可以产生数千个greenlet(每个连接一个)几乎没有开销.阻止单个greenlet对服务器接受新请求的能力没有影响.并发连接数实际上是无限的.

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


rgu*_*ert 5

我假设你在谈论evenlet/gevent greenlets

1)只能运行一个greenlet

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

3)不仅仅是线程,这取决于可用的RAM量

  • 我不确定,但我认为在 greenlets 之间切换比切换操作系统线程更快,因为它们更轻,但不要引用我的话 (2认同)