2015-02-07 13 views
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 

我應該用什麼樣的替代並行執行的,以同時執行多項任務,這個執行環境下?

+3

你的應用程序容器(uWSGI,或無論你想要什麼)需要知道你是否想要使用特定的開發模式。 grequests需要一個gevent中心,所以uWSGI必須以gevent模式運行。對於使用用戶生成的線程,您需要使用啓用線程來啓用它們,就像第一個回答 – roberto 2015-02-07 08:02:05

+0

中所解釋的那樣,我使用'threading.Thread' +'uwsgi'和添加'enable-threads = true'的問題同樣如此魅力! +1 – Caumons 2017-05-20 15:17:32

回答