2015-10-16 4 views
0

У меня есть скрипт, который перебирает массив чисел, эти числа передаются функции, вызывающей и API. Он возвращает данные JSON, которые затем записываются в CSV.Multiprocess 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

Многопроцессорность может помочь, но это больше похоже на проблему с потоками. Любая реализация ввода-вывода должна выполняться асинхронно, что и делает потоки. Лучше, в python3.4 и далее, вы можете сделать asyncio. https://docs.python.org/3.4/library/asyncio.html

Если у вас есть python3.5, это будет полезно: https://docs.python.org/3.5/library/asyncio-task.html#example-hello-world-coroutine

Вы можете смешать asyncio с multiprocessing, чтобы получить оптимизированный результат. Я использую дополнительно 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

Смежные вопросы