大家有什么更好的建议,可以留言回复我,
网上asyncio的资料太少了,翻来覆去就是那几份
不多说了,贴代码
#####################################queue-async###############################################
"""
这段代码是利用queue管理协程执行
"""
url_queue=asyncio.queues.Queue()
content_queue=asyncio.queues.Queue()
async def queue_manage(loop):
"""利用queue动态管理loop的执行状态"""
await asyncio.sleep(2)
for i in [url_queue,content_queue]:
await i.join()
print(tasks)
loop.stop()
async def deatil():
while 1:
await asyncio.sleep(2)
content=await content_queue.get()
print('获取详情:',content)
content_queue.task_done()
async def list():
while 1:
url=await url_queue.get()
print('请求url:',url)
await asyncio.sleep(2)
for i in range(5):
i=f'{url}-{i}'
await content_queue.put(i)
url_queue.task_done()
async def type():
for i in range(10):
await asyncio.sleep(1)
print('发送url:',i)
await url_queue.put(i)
def queue_main():
loop=asyncio.get_event_loop()
#这里global是为了让其它函数使用这个tasks变量,全局变量中并没有这个变量
global tasks
tasks=[loop.create_task(type())]
for i in range(2):
tasks.append(loop.create_task(list()))
for i in range(4):
tasks.append(loop.create_task(deatil()))
tasks.append(loop.create_task(queue_manage(loop)))
try:
loop.run_until_complete(asyncio.wait(tasks))
except Exception:
#因为有个queue_manage所以执行完毕后,这里会抛出异常,
# loop此时已经是close的状态了
#不需要再次close了
...
#queue_main()
###################################动态添加子协程###############################################
"""
这段代码是确保嵌套子协程中的task任务都能够执行完毕
"""
async def async_grandson(i):
await asyncio.sleep(4)
print('执行async_son 子协程',i)
async def async_son(url):
#创建一个局部变量,用来存储future对象
tasks=[]
print('执行子协程:',url)
await asyncio.sleep(2)
for i in range(5):
tasks.append(asyncio.ensure_future(async_grandson(f'{url}-{i}')))
#到任务结束时刻,等待局部的所有future完成
await asyncio.wait(tasks)
async def run():
task=[]
for i in range(10):
print('添加子协程:',i)
task.append(asyncio.ensure_future(async_son(i)))
print(task)
await asyncio.wait(task)
print('子协程执行完毕')
def dynamic_main():
loop=asyncio.get_event_loop()
loop.run_until_complete(run())
#dynamic_main()