在阅读了相当多关于 asyncio 的内容之后(我对它完全是菜鸟),我已经成功编写了一些简单的程序来完成我想要它们做的事情。
然而,我对 as_completed 方法有一些疑问:它的内部工作原理以及它如何影响我的 CPU 使用率。
因此,让有以下片段:
#as_completed_example.py
import asyncio
import tqdm
import datetime
import sys
import signal
import random
#--------------------------------------------------------------------------------------
async def heavy_load(i):
#tqdm.tqdm.write('#DEBUG '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' '+str(i))
await asyncio.sleep(random.random())
return None
#--------------------------------------------------------------------------------------
async def main():
length = int(sys.argv[1])
inputs = list(range(length))
pbar = tqdm.tqdm(total=len(inputs),position=0,leave=True,bar_format='#PROGRESS {desc}: {percentage:.3f}%|{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}')
tasks = [heavy_load(i) for i in inputs]
for future in asyncio.as_completed(tasks):
_ = await future
pbar.update(1)
pbar.refresh()
#---------------------------------------------------------------------------
def sigint_handler(signum,frame):
tqdm.tqdm.write('#INFO '+datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')+' user aborted execution!')
sys.exit(0)
#---------------------------------------------------------------------------
if(__name__=='__main__'):
signal.signal(signal.SIGINT,sigint_handler)
asyncio.run(main())
如果我将其称为 python3 as_completed_example.py 1000
,它会完美地工作。然而,如果我将其称为as_completed_example.py 1000000 (large number)
,我会观察到我的进度条在相当长的一段时间内卡在 0% :
-虽然我的进度条为 0%,
--我的 CPU 发生了什么?因为需要一个核心才能达到 100% 使用率
-为什么我future
在相当长一段时间后没有从 as_completed得到任何信息?
猛跑小猪
相关分类