Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Eventlet wsgi服务器和请求中耗时的操作_Python_Wsgi_Eventlet - Fatal编程技术网

Python Eventlet 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操作时,服务器被有效阻止,

假设我们有一个WSGI应用程序,它托管在事件驱动的单线程服务器上:

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文档

如果可以,将整个应用程序重新设计为阻塞和非阻塞流程,并让它们通过套接字进行通信。从代码重写的角度来看这很难,但对于运行时、调试来说非常简单;稳健和防故障设计