for循环体内的任务如何由同步改为异步??
#这是一个异步任务函数体,每次处理一个url
async def checkLink(link: str):
do_something……
async def Task(linksList: list): #linksList是一组需要处理的url
try:
for link in linksList: #这里的for循环体出现了阻塞
resultDict = await checkLink(link)
if resultDict:
result.put(resultDict) #将处理结果(字典)放到结果队列中
else:
print(“处理结果异常”)
except Exception as e:
print(f"异常信息 {e}")
为了解决以上函数的for循环体的阻塞,我改为如下
async def checkLink(link: str):
do_something……
async def Task(linksList: list): #linksList是一组需要处理的url
try:
for link in linksList:
task.append(checkLink(link))
results = await asyncio.gather(*task) #使用asyncio.gather 进行异步分组处理,并将结果传给results
for resultDict in results: #遍历所有处理结果
if resultDict:
result.put(resultDict) #将处理结果(字典)放到结果队列中
else:
print(“处理结果异常”)
except Exception as e:
print(f"异常信息 {e}")
但是修改之后这个函数的语法貌似不对,请问该如何修改?
谢谢
在你的修改中,你没有定义task列表,需要先将task定义为一个空的列表。另外,你可以将asyncio.gather直接作为for循环的迭代器,避免使用中间列表。
以下是修改后的代码:
async def checkLink(link: str):
# do_something……
pass
async def Task(linksList: list):
try:
task = []
for link in linksList:
task.append(checkLink(link))
async for resultDict in asyncio.gather(*task):
if resultDict:
result.put(resultDict)
else:
print("处理结果异常")
except Exception as e:
print(f"异常信息 {e}")
这个版本定义了task列表,使用async for循环迭代asyncio.gather的结果,并在每个结果字典中检查是否需要将其放入结果队列中。
以下答案引用自GPT-3大模型,请合理使用:
。
可以这样修改:
async def Task(linksList: list): #linksList是一组需要处理的url
try:
task = [checkLink(link) for link in linksList] # 使用for循环创建异步任务
results = await asyncio.gather(*task) # 使用asyncio.gather()将异步任务分组处理
for resultDict in results: # 遍历处理完的结果
if resultDict:
result.put(resultDict) # 将处理结果(字典)放到结果队列中
else:
print('处理结果异常')
except Exception as e:
print(f"异常信息 {e}")
如果我的回答解决了您的问题,请采纳我的回答
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!