使用阻止Flask应用程序的第三方Python模块
我的使用websockets的应用程序还使用了几个第三方Python模块,这些模块似乎是在调用时阻塞应用程序的其余部分的方式编写的。例如,我使用xlrd解析用户上传的Excel文件。使用阻止Flask应用程序的第三方Python模块
我有猴子修补这样的内建应用程序中的第一行:
import os
import eventlet
if os.name == 'nt':
eventlet.monkey_patch(os=False)
else:
eventlet.monkey_patch()
然后我使用以下方法来启动包含到xlrd调用任务。
socketio.start_background_task(my_background_task)
什么是现在调用这些其他模块的适当方式,以便我的应用程序运行顺利? 多处理模块是否以正确的方式启动绿色线程内的另一个进程?
- 首先你应该尝试线程池[1]。
- 如果这样做效果不理想,请提交问题[2],并使用多处理作为解决方法。
eventlet.tpool.execute(xlrd_read, file_path, other=arg)
在Python线程执行甲基,阻塞当前协程/ greenthread直到方法完成。
这样做的主要用例是包装一个不适合monkeypatching的对象或模块,或者Eventlet用来实现合作良率的任何其他技巧。通过tpool,你可以强制这些对象与绿色线程合作,把它们粘在本地线程中,这是以一些开销为代价的。
谢谢,这看起来像一个可行的解决方案,但我认为我将不得不去除线程池中的所有monkeypatching。至少这是[这篇文章](https://bitbucket.org/eventlet/eventlet/pull-requests/29/fix-use-of-semaphore-with-tpool-issue-137/diff)似乎表明。我遇到了“无法切换线程”的类似错误。是对的吗? – damonology
如果您遇到错误,那么在旧的bitbucket回购中讨论的错误可能仍然存在,是的。走线程的路线,我建议手术'tpool.execute'只在阻塞函数,如'file.read'。 – temoto
我简要地检查了代码xlrd和乍一看我没有看到有什么能与eventlet冲突。你确切知道挂起发生在哪里?另外,如果您卸载eventlet以强制使用常规线程模式,是否一切正常? – Miguel