7

我从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 新手。我很好奇,如果每个 greenthread 都与底层 OS 线程相关联?

4

1 回答 1

6

每个绿色线程都与一个 Python 线程绑定,该 Python 线程与一个 OS 线程绑定。理论上,Eventlet 可以在多个 Python 线程中分配绿色线程,因此也可以在 OS 线程中分配,但由于Python 代码不会在 CPython [1] 上并行执行,因此这项工作量很大,但收益甚微。

经验法则:如果你想使用多个核心,选择其他语言使用 Python,您最好的选择是运行多个进程。快速方法是multiprocessing[2](自 2.6 起在 stdlib 中),稳健方法是os.fork手动 [3][4]。

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

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

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

于 2013-03-09T13:13:52.117 回答