我有以下情况:
aiohttp
),并将调用结果保存到Mongo(使用motor
)。因此,有很多IO正在进行。该代码是使用async
/ await
编写的,对于手动执行的单个调用也可以正常工作。
我不知道该怎么做,就是大量使用输入数据。
我看到的所有asyncio
示例都通过发送有限列表作为参数来演示asyncio.wait
。但是我不能简单地向它发送任务列表,因为输入文件可能有数百万行。
我的情况是关于通过传送带将数据流传输到消费者。
我还能做什么?我希望程序使用它可以聚集的所有资源来处理文件中的数据,而又不会感到不知所措。
答案 0 :(得分:2)
我的情况是关于通过传送带将数据流传输到消费者。我还能做什么?
您可以创建与传送带的容量大致相对应的固定数量的任务,然后将其弹出queue。例如:
async def consumer(queue):
while True:
line = await queue.get()
# connect to API, Mongo, etc.
...
queue.task_done()
async def producer():
N_TASKS = 10
loop = asyncio.get_event_loop()
queue = asyncio.Queue(N_TASKS)
tasks = [loop.create_task(consume(queue)) for _ in range(N_TASKS)]
try:
with open('input') as f:
for line in f:
await queue.put(line)
await queue.join()
finally:
for t in tasks:
t.cancel()
由于与线程不同,任务是轻量级的,并且不占用操作系统资源,因此最好在创建“太多”任务时犯错。 asyncio可以毫不费力地处理成千上万的任务,尽管这对于这些任务可能是过大的,几十就足够了。