py-asyncio利用queue动态管理loop执行状态

大家有什么更好的建议,可以留言回复我,

网上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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值