在下面的代码中,我调用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_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()
,则应在完全完成事件循环后调用它。