【问题标题】:uWSGI, Flask and Parallel execution blocksuWSGI、Flask 和并行执行块
【发布时间】:2015-04-07 06:44:11
【问题描述】:

我有一个用 Flask 用 Python 编写的小型 API。它是围绕另一个 API(我无法控制)的包装 API。我需要提出几个请求,我想让它们并行。第一种选择是使用grequests,但莫名其妙地uwsgi 服务器挂起并且没有响应。在向主进程发送HUP 信号后,它需要一段时间才能重新加载工作人员。我使用的代码类似于:

urls = [
    'http://www.example.com', 
    'http://www.example.net',
]
urls = [grequests.get(x, hooks=dict(response=function_to_do_some_work))
        for url in urls]
grequests.map(urls) # <- here it hangs

我认为gevent/grequests 有问题,所以我使用multiprocessing.Pool 重新实现了解决方案,如下所示:

urls = [
    'http://www.example.com', 
    'http://www.example.net',
]
pool = multiprocessing.Pool(10)
pool.map(function_to_do_some_work, urls) # <- here it hangs

这里的问题不是代码,它可以在开发环境中完美运行。问题在于 uwsgi 和 Python 执行模型,或者介于这些行之间的东西。我不知道从哪里开始在这里寻找答案。我正在使用的模块版本是:

Python 2.7.5
grequests 0.2.0
Flask 0.10.1
uwsgi 2.0.9

在这种执行环境下,我应该使用什么替代并行执行来同时执行多个任务?

【问题讨论】:

  • 您的应用程序容器(uWSGI 或任何您想要的)需要知道您是否要使用特定的开发范例。 grequests 需要一个 gevent hub,所以 uWSGI 必须在 gevent 模式下运行。要使用用户生成的线程,您需要使用第一个答案中解释的启用线程来启用它们
  • 我在使用threading.Thread + uwsgi 时遇到了同样的问题,添加enable-threads = true 就像一个魅力! +1

标签: python flask uwsgi


【解决方案1】:

线程需要通过

在 uwsgi 上启用
enable-threads = True

nginx的完整配置示例,uwsgi,upstart,virtual-env见

https://stackoverflow.com/a/27221427/567606

【讨论】:

    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2018-08-07
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多