使用阻止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) 

什么是现在调用这些其他模块的适当方式,以便我的应用程序运行顺利? 多处理模块是否以正确的方式启动绿色线程内的另一个进程?

+0

我简要地检查了代码xlrd和乍一看我没有看到有什么能与eventlet冲突。你确切知道挂起发生在哪里?另外,如果您卸载eventlet以强制使用常规线程模式,是否一切正常? – Miguel

  • 首先你应该尝试线程池[1]。
  • 如果这样做效果不理想,请提交问题[2],并使用多处理作为解决方法。

eventlet.tpool.execute(xlrd_read, file_path, other=arg)

在Python线程执行甲基,阻塞当前协程/ greenthread直到方法完成。

这样做的主要用例是包装一个不适合monkeypatching的对象或模块,或者Eventlet用来实现合作良率的任何其他技巧。通过tpool,你可以强制这些对象与绿色线程合作,把它们粘在本地线程中,这是以一些开销为代价的。

[1] http://eventlet.net/doc/threading.html

[2] https://github.com/eventlet/eventlet/issues

+0

谢谢,这看起来像一个可行的解决方案,但我认为我将不得不去除线程池中的所有monkeypatching。至少这是[这篇文章](https://bitbucket.org/eventlet/eventlet/pull-requests/29/fix-use-of-semaphore-with-tpool-issue-137/diff)似乎表明。我遇到了“无法切换线程”的类似错误。是对的吗? – damonology

+0

如果您遇到错误,那么在旧的bitbucket回购中讨论的错误可能仍然存在,是的。走线程的路线,我建议手术'tpool.execute'只在阻塞函数,如'file.read'。 – temoto