1
我有一個用Python編寫的Flask小API。它是另一個API(我不能控制)的封裝API。我需要提出幾個請求,我想讓它們平行。第一個替代方案是使用grequests
,但是不可思議的是服務器掛起並且沒有響應。在發送HUP
信號給主進程之後,它花了一段時間重新加載工作人員。我使用的代碼是一樣的東西:uWSGI,Flask和並行執行塊
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中心,所以uWSGI必須以gevent模式運行。對於使用用戶生成的線程,您需要使用啓用線程來啓用它們,就像第一個回答 – roberto 2015-02-07 08:02:05
中所解釋的那樣,我使用'threading.Thread' +'uwsgi'和添加'enable-threads = true'的問題同樣如此魅力! +1 – Caumons 2017-05-20 15:17:32