2015-10-16 46 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