2015-10-16 48 views
0

我有一個腳本循環一個數組數組,這些數字被傳遞給一個函數調用和API。它返回JSON數據,然後寫入CSV。多進程Python 3

for label_number in label_array: 
    call_api(domain, api_call_1, api_call_2, label_number, api_key) 

列表可高達7000元大,因爲API需要幾秒鐘響應這可能需要時間來運行整個腳本。多處理似乎是這樣的方式。我無法完全解決上述問題。我在看的文檔是

https://docs.python.org/3.5/library/multiprocessing.html

我發現了一個類似的文章在

Python Multiprocessing a for loop

但操縱它似乎沒有工作,我想我buggering起來的時候,它將所有變量傳遞給函數。

任何幫助,將不勝感激。

+0

我正在使用17.2.1.1。 Process類和它似乎正確地通過循環,但我得到ValueError:關閉文件上的I/O操作。所以看起來作家正在關閉文件。 – LOFast

+0

好吧似乎有它的工作,不寫入CSV,但仍然似乎很慢。可能這不適合使用。 – LOFast

+0

打開'multiprocessing.Pool',然後打開'.map'。不能比這更容易 – JBernardo

回答

1

多處理可以幫助,但這聽起來更像是一個線程問題。任何IO實現都應該是異步的,這就是線程所做的。更好的是,在python3.4之後,你可以做asynciohttps://docs.python.org/3.4/library/asyncio.html

如果你有python3.5,這將是有用的:https://docs.python.org/3.5/library/asyncio-task.html#example-hello-world-coroutine

你可以混合使用asynciomultiprocessing得到最優化的結果。我另外使用joblib

import multiprocessing 
from joblib import Parallel, delayed 

def parallelProcess(i): 
    for index, label_number in enumerate(label_array): 
     if index % i == 0: 
      call_api_async(domain, api_call_1, api_call_2, label_number, api_key) 

if __name__=="__main__": 
    num_cores_to_use = multiprocessing.cpu_count() 
    inputs = range(num_cores_to_use) 
    Parallel(n_jobs=num_cores_to_use)(delayed(parallelProcess)(i) for i in inputs) 
+0

同意。 API查詢無論如何都會中斷您的線程,因此其他用戶空間線程可以同時彈出並運行。 – Dacav