Цикл событий в asyncio переполнен.Хотя добавление 4-х исполнений за раз это перегрузка - PullRequest
0 голосов
/ 01 февраля 2019

В следующем коде я вызываю функцию getSUEPEvent () 4 раза для одного цикла.Я снова запускаю цикл для следующего 4. Тем не менее выполнение продолжает добавляться в цикл.Если цикл является глобальным, то любой может предложить другую стратегию, которая может функционировать n раз путем группировки или любым другим способом.

def SEUPCustomers(featurecode,threshholdTime):
    # headers = buildHeaders()
    with open("ActiveCustomers.csv","r") as f:
        SEUPCustomersList = []
        csvReader = csv.reader(f)
        tasks = []
        for row in csvReader:
            tasks.append(asyncio.ensure_future(getSEUPEvents(featurecode,row,threshholdTime,SEUPCustomersList)))

        for task in range(0,len(tasks),4):
            loop = asyncio.get_event_loop()
            loop.run_until_complete(asyncio.wait(tasks[task:task+4]))
            loop.close()

1 Ответ

0 голосов
/ 01 февраля 2019

ensure_future и run_until_complete не работают так, как вы ожидаете.Вот что они делают:

  • ensure_future планирует ожидаемое выполнение в основном цикле, эффективно создавая то, что можно было бы назвать «фоновой задачей», которая будет запускаться всякий раз, когда выполняется основной цикл;

  • run_until_complete отправляет ожидаемое событие в цикл событий, а запускает цикл событий до тех пор, пока это конкретное будущее не завершится.

Итак, если вы отправите 100 задач в цикл событий, а затем с помощью run_until_complete дождитесь завершения одной из них, цикл запустит все 100 задач и остановится, как только завершится та, завершение которой вас интересует.

Чтобы написать нужный код, вы можете просто избежать шага ensure_future:

def SEUPCustomers(featurecode,threshholdTime):
    # headers = buildHeaders()
    with open("ActiveCustomers.csv","r") as f:
        SEUPCustomersList = []
        csvReader = csv.reader(f)
        coros = []
        for row in csvReader:
            coros.append(getSEUPEvents(featurecode,row,threshholdTime,SEUPCustomersList))

        loop = asyncio.get_event_loop()
        for i in range(0,len(coros),4):
            loop.run_until_complete(asyncio.wait(coros[i:i+4]))

Кроме того, loop.close() неверно, если вы планируете использовать цикл позже.Если вы вообще позвоните loop.close(), вам следует позвонить, как только вы закончите цикл обработки событий.

...