在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  網(wǎng)絡(luò)安全/ 請問:Python的Ascynio模塊怎么中止EventLoop?

請問:Python的Ascynio模塊怎么中止EventLoop?

請教一個Python的Ascynio模塊中止異步IO的EventLoop的問題?,F(xiàn)在我有2個任務(wù),任務(wù)1的執(zhí)行時間可能比較長(比如35秒左右),任務(wù)2的執(zhí)行時間非常短、可以認(rèn)為瞬間完成。我需要的代碼是:先執(zhí)行任務(wù)1,然后等待30秒,如果任務(wù)1完成了那么結(jié)束;如果任務(wù)1沒完成那么去執(zhí)行任務(wù)2然后結(jié)束。

以下代碼是個非常簡單的并發(fā)執(zhí)行,

    @asyncio.coroutine
    def async_task_1():
        執(zhí)行任務(wù)1
    @asyncio.coroutine
    def async_task_2():
        yield from asyncio.sleep(30)
        執(zhí)行任務(wù)2
        
    loop = asyncio.get_event_loop()
    tasks = [async_task_1, async_task_2]
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()

但是以上代碼有個缺陷:畢竟是loop.run_until_complete,也就是說即使任務(wù)1執(zhí)行時間奇長,loop也會等它到地老天荒。但是我要的是最多等30秒,如果等不到任務(wù)1完成,那就做任務(wù)2然后結(jié)束。任務(wù)2的運(yùn)行時間幾乎為0。請問這個該怎么實(shí)現(xiàn)呢?

謝謝了先!

回答
編輯回答
糖果果

題主的真正需求:給任務(wù)1設(shè)置個 超時,超過一定時間,就放棄執(zhí)行。轉(zhuǎn)而執(zhí)行任務(wù) 2。

所以可以考慮對任務(wù) 1 使用 asyncio.wait_for 包裹一下。

舉個?:

import asyncio


async def task1():
    print('task1 begin')
    await asyncio.sleep(3)
    print('task1 finish')  # will never finish


async def task2():
    try:
        await asyncio.wait_for(task1(), timeout=2)
    except asyncio.TimeoutError:
        print('task1 timeout')
    print('task2 begin')
    # do something
    print('task2 finished')


loop = asyncio.get_event_loop()
loop.run_until_complete(task2())
loop.close()

另外,題主的題目可以修改一下,因?yàn)槟阒皇窍胍兄挂粋€ task 或者說一個 coroutine,并非中止 eventloop。

2018年1月12日 03:33