uWSGI、Flask 和并行执行块
uWSGI, Flask and Parallel execution blocks
我有一个用 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 上启用线程
enable-threads = True
nginx、uwsgi、upstart、virtual-env 的完整配置示例见
我有一个用 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 上启用线程enable-threads = True
nginx、uwsgi、upstart、virtual-env 的完整配置示例见