python3.9 all_tasks()问题

来源:13-3 task取消和子协程调用原理

Necromancer_

2022-01-02

python3.9中 asyncio.Task.all_tasks()调用变为了asyncio.all_tasks(),但是有一个问题,在捕获KeyboardInterrupt后all_tasks = asyncio.all_tasks()无法找到当前事件循环,报错no running event loop,需要在all_tasks = asyncio.all_tasks(loop)中直接传入loop,传入参数loop后代码正常运行。查阅官方文档与谷歌搜索后无法理解为何all_tasks(None)无法找到当前event loop,遂请教老师!

# -*- coding: utf-8 -*-
import asyncio
import time
async def get(time):
	print('waiting')
	await asyncio.sleep(time)
	print(f'down after {time}s')

if __name__ == '__main__':
	starttime = time.time()
	task1 = get(2)
	task2 = get(3)
	task3 = get(3)
	tasks = [task1,task2,task3]
	loop = asyncio.get_event_loop()
	try:
		loop.run_until_complete(asyncio.wait(tasks))
	except KeyboardInterrupt as e:
		alltasks = asyncio.all_tasks(loop)
		for task in alltasks:
			print('cancel')
			print(task.cancel())
		loop.stop()
		loop.run_forever()
	finally:
		loop.close()



	print(time.time()-starttime)


写回答

1回答

Necromancer_

提问者

2022-01-03

老师你好,问题已找到答案。通过查阅python3.6与python3.9的asyncio源码发现问题是调用方法get_event_loop()与get_running_loop()的不同,python3.6中使用get_event_loop(),而3.9的asyncio.all_tasks()是调用了get_running_loop(),而二者的区别答案链接如下:https://stackoverflow.com/questions/65206110/when-should-we-use-asyncio-get-running-loop-vs-asyncio-get-event-loop

0
1
bobby
赞一个。。。
2022-01-04
共1条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程