一个绿色的线程等于一个“真正的”线程吗

2024-10-01 07:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我从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线程?在


Tags: fromimport示例wsgihelloworldservertime
1条回答
网友
1楼 · 发布于 2024-10-01 07:46:27

每个绿色线程都与一个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

相关问题 更多 >