Python Eventlet wsgi服务器和请求中耗时的操作
假设我们有一个WSGI应用程序,它托管在事件驱动的单线程服务器上:Python Eventlet wsgi服务器和请求中耗时的操作,python,wsgi,eventlet,Python,Wsgi,Eventlet,假设我们有一个WSGI应用程序,它托管在事件驱动的单线程服务器上: from eventlet import wsgi import eventlet def app(env, start_response): # IO opeartions here ... wsgi.server(eventlet.listen(('', 8090)), app) 在应用程序功能中,必须执行一些I/O操作,如读取文件或访问数据库 现在,当我们在应用程序中执行IO操作时,服务器被有效阻止,
from eventlet import wsgi
import eventlet
def app(env, start_response):
# IO opeartions here
...
wsgi.server(eventlet.listen(('', 8090)), app)
在应用程序功能中,必须执行一些I/O操作,如读取文件或访问数据库
现在,当我们在应用程序中执行IO操作时,服务器被有效阻止,无法为其他客户端提供服务
Q:这个问题的可能解决方案是什么?如何让Eventlet wsgi服务器在不被阻止的情况下执行耗时的操作;DR:使用mysqldb/psycopg或
eventlet.import_patched()
纯python DB驱动程序<代码>tpool.execute()用于文件和其他所有内容
试着将你的思维过程修复为分离的操作,这些操作可以转化为与Eventlet的合作,也可以转化为不可能的合作。这里的合作意味着进入“执行代码”-“等待结果”部分,并在结果准备就绪时提供通知机制。Eventlet的主要通知机制是文件描述符
所以等待文件描述符的所有内容都是绿色的(而不是阻塞)。最重要的是,它会影响所有网络IO。如果您的阻塞函数是用纯Python编写的,只需使用import\u patched(module\u name)
修改其socket
以及对Eventlet绿色版本的其他引用mysqldb
和psycopg2
是C扩展模块的特例,感谢作者的明确支持。非Python代码中的所有其他阻塞—您的选项是OS线程
不幸的是,等待实际的磁盘文件充满了怪癖,所以我建议使用OS线程,我们有内置的线程池来支持这一点。将blocking\u-fun(文件路径,其他内容)
转换为eventlet.tpool.execute(blocking\u-fun,文件路径,其他内容)
,它不会阻止所有内容。有关详细信息,请查看tpool文档
如果可以,将整个应用程序重新设计为阻塞和非阻塞流程,并让它们通过套接字进行通信。从代码重写的角度来看这很难,但对于运行时、调试来说非常简单;稳健和防故障设计