我从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与底层操作系统线程绑定?
答案 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