使用阻止Flask应用程序的第三方Python模块

时间:2016-09-26 14:38:46

标签: python flask eventlet flask-socketio

我使用websockets的应用程序也使用了几个第三方Python模块,这些模块看起来像是在调用时阻塞应用程序的其余部分。例如,我使用 xlrd 来解析用户上传的Excel文件。

我已经在应用程序的第一行修补了内置类似的内容:

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 个答案:

答案 0 :(得分:0)

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

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

  

在Python线程中执行meth,阻止当前的coroutine / greenthread,直到方法完成。

     

这个的主要用例是包装一个不适合monkeypatching的对象或模块或者Eventlet用来实现合作屈服的任何其他技巧。使用tpool,您可以强制这些对象与绿色线程配合,方法是将它们粘贴在本机线程中,但需要花费一些开销。

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

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