Запустите функцию в фоновом режиме, которая возвращает список - PullRequest
2 голосов
/ 06 марта 2019

Я пытаюсь получить свою функцию, которая делает веб-запросы для всех элементов списка:

import myClass

def getForAll(elements):
    myList = []
    for element in elements:
        myList.append([element] + myClass.doThing(element))
    return myList

Я пробовал следующее, но оно всегда истекло:

    import myClass
    from multiprocessing import Pool

def getForAll(elements):
    pool = Pool()
    queries = []
    for element in elements:
        queries.append(pool.apply_async(myClass.doThing, element))
    myList = []
    for query in queries:
        myList.append(query.get(timeout=10))
    return myList

Однако это не проблема времени, потому что удаление таймаута просто заставляет его работать вечно.

queries.append(pool.apply_async(myClass.doThing, [element]))

Тоже ничего не изменилось.

Для пояснения: я вызываю getForAll() со списком строк, а функция doThing() возвращает список списков строк. Мне не нужен порядок, чтобы остаться прежним, но было бы неплохо, если это возможно. Кроме того, мне не нужно разделять «CPU-Work» на несколько ядер, я просто не хочу ждать около одной секунды на элемент, потому что doThing дважды вызывает requests.get(), и я считаю, что это можно сделать для всех элементы одновременно, не дожидаясь ответа, заставляя код выполняться с одинаковой скоростью независимо от количества элементов?

1 Ответ

1 голос
/ 07 марта 2019
import myClass
from multiprocessing import Pool

def getForAll(elements):
    pool = Pool()    
    return pool.map(myClass.doThing, elements)

Это прекрасно работает для моего варианта использования. Мне также пришлось разделить свои элементы на более мелкие группы из-за ограничений API, которые я использовал, с этим кодом из SO:

f = lambda A, n=5: [A[i:i + n] for i in range(0, len(A), n)]
queries = f(elements)
...