我从以下位置获取了示例代码理解 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(使用前将#替换为@)