绿色线程是否等于“真实”线程

2024-02-21

我从以下位置获取了示例代码理解 eventlet.wsgi.server https://stackoverflow.com/questions/8509209/unterstanding-eventlet-wsgi-server.

from eventlet import wsgi
import eventlet
from eventlet.green import time
import threading

def hello_world(env, start_response):
    print "got request", eventlet.greenthread.getcurrent(), threading.currentThread()
    time.sleep(10)
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['Hello, World!\n']

wsgi.server(eventlet.listen(('', 8090)), hello_world)

当我通过不同的客户端 IP 地址访问 Web 服务器时,我可以看到它们是并行处理的。并打印在hello_world,我还可以知道它们是在两个不同的绿色线程中处理的,但在同一个操作系统线程中。

我是Python新手。我很好奇每个绿色线程是否都与底层操作系统线程相关?


每个绿色线程都与一个 Python 线程绑定,而该 Python 线程又与一个操作系统线程绑定。理论上,Eventlet 可以在多个 Python 线程之间分配绿色线程,从而在操作系统线程之间分配绿色线程,但这是一项繁重的工作,但收效甚微,因为Python代码不在 CPython 上并行执行 [1]。

Rule of thumb: if you want to use multiple cores, choose other language with Python your best bet is to run several processes. Quick way is multiprocessing[2] (in stdlib since 2.6), robust way is os.fork[3][4] manually.

对术语做一点澄清:对于大多数流行的操作系统,并行执行代码的唯一方法是拥有多个操作系统线程。 严格来说,您的请求不是并行处理,而是并发处理;正是因为只有一个操作系统线程。在任何给定时刻,只有一个绿色线程执行某些代码。顺便说一句,同样的限制也适用于常规 Python 线程,这就是为什么 Eventlet(或其他绿色线程库)大多数情况下只是作为直接替换,并且(大多数情况下)不会导致任何新的异常错误。

您可能会发现这个答案很有用:https://stackoverflow.com/posts/14227272/revisions https://stackoverflow.com/posts/14227272/revisions

[1] http://wiki.python.org/moin/GlobalInterpreterLock http://wiki.python.org/moin/GlobalInterpreterLock
[2] http://docs.python.org/2/library/multiprocessing.html http://docs.python.org/2/library/multiprocessing.html
[3] http://docs.python.org/2/library/os.html#os.fork http://docs.python.org/2/library/os.html#os.fork
[4] https://github.com/jonashaag/bjoern/blob/master/tests/fork.py https://github.com/jonashaag/bjoern/blob/master/tests/fork.py

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绿色线程是否等于“真实”线程 的相关文章

随机推荐