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()
, вам следует позвонить, как только вы закончите цикл обработки событий.