异步中的事件循环溢出.虽然一次添加 4 个执行,但它是重载的



在下面的代码中,我调用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()

ensure_futurerun_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(),则应在完全完成事件循环后调用它。

相关内容

  • 没有找到相关文章

最新更新