Python 3.x asyncio中的事件循环溢出。虽然一次添加4个执行,但这是重载

Python 3.x asyncio中的事件循环溢出。虽然一次添加4个执行,但这是重载,python-3.x,python-asyncio,coroutine,aiohttp,Python 3.x,Python Asyncio,Coroutine,Aiohttp,在下面的代码中,我对单循环调用getSUEPEvent()函数4次。我再次为下一个4重新启动循环。仍然执行继续添加到循环中。如果循环是全局的,则任何一个都可以通过分组或任何其他方式建议另一种策略来控制函数的时间数 def SEUPCustomers(featurecode,threshholdTime): # headers = buildHeaders() with open("ActiveCustomers.csv","r") as f: SEUPCustom

在下面的代码中,我对单循环调用getSUEPEvent()函数4次。我再次为下一个4重新启动循环。仍然执行继续添加到循环中。如果循环是全局的,则任何一个都可以通过分组或任何其他方式建议另一种策略来控制函数的时间数

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()

确保未来
运行_直到_完成
不要按您期望的方式工作。他们是这样做的:


  • sure_future
    调度等待在主循环中运行的任务,有效地创建所谓的“后台任务”,该任务将在主循环运行时运行

  • 运行直到完成
    将给定的可等待事件提交给事件循环,并运行事件循环直到特定的未来完成

因此,如果您将100个任务提交给事件循环,然后使用
run_until_complete
等待其中一个任务完成,那么循环将运行所有100个任务,并在您感兴趣的任务完成后停止

要编写所需的代码,只需避免
sure_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()
,则应该在事件循环完成后调用它。

确保将来的
运行直到完成
不会按您期望的方式运行。他们是这样做的:


  • sure_future
    调度等待在主循环中运行的任务,有效地创建所谓的“后台任务”,该任务将在主循环运行时运行

  • 运行直到完成
    将给定的可等待事件提交给事件循环,并运行事件循环直到特定的未来完成

因此,如果您将100个任务提交给事件循环,然后使用
run_until_complete
等待其中一个任务完成,那么循环将运行所有100个任务,并在您感兴趣的任务完成后停止

要编写所需的代码,只需避免
sure_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()
,则应该在完全完成事件循环后调用它