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

时间:2013-03-08 05:06:46

标签: python eventlet

我从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中的打印,我还可以在两个不同的greenthreads中处理它们,但是在相同的OS线程中。

我是Python的新手。我很好奇,如果每个greenthread与底层操作系统线程绑定?

1 个答案:

答案 0 :(得分:5)

每个绿色线程都与一个Python线程绑定,该线程与一个OS线程紧密相关。从理论上讲,Eventlet可以在几个Python线程中分配绿色线程,因此可以分配OS线程,但由于 Python代码不能在CPython上并行执行,因此很多工作都没有什么好处[1]

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

对术语进行一点澄清: 对于大多数流行的操作系统,并行执行代码的唯一方法是拥有多个OS线程。 严格来说,您的请求不是并行处理,而是同时处理;正是因为只有一个OS线程。在任何给定的时刻,只有一个绿色线程执行某些代码。顺便说一句,同样的限制适用于常规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