我从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线程?在
每个绿色线程都与一个Python线程绑定在一起,而Python线程只绑定到一个OS线程。理论上,Eventlet可以将绿色线程分布到多个Python线程上,因此也可以分布到OS线程上,但是由于Python代码不是在CPython上并行执行的,所以这是一项大量的工作,而且没有什么好处。在
经验法则:如果您想使用多个内核,
使用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
相关问题 更多 >
编程相关推荐