python中的并发循环

问题描述

我的场景:- 开始、等待、开始、停止或终止

  1. 开始第一个活动并等待一段时间。
  2. 如果到达等待时间,我需要开始第二个事件并返回两个事件结果。
  3. 但是,如果第一个事件在等待时间之前完成。
  4. 无需开始第二个活动。
  5. 返回第一个事件结果

例如:-

import asyncio

async def some_task():
    print('io start')
    await asyncio.sleep(2)
    print('io end')
    return "hello"

async def callback(loop):
    await asyncio.sleep(4)
    if loop.is_running():
        print('doing other things')

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop2 = asyncio.get_event_loop()
    a = loop.create_task(some_task())
    b = loop2.create_task(callback(loop))
    result = loop.run_until_complete(a)
    loop2.run_until_complete(b)
    loop.close()
    loop2.close()

解决方法

变量 looploop2 将获得相同的(主)事件循环,这就是为什么它会一直运行。这是我的方法:

import asyncio

async def async_main():
    result = None

    async def some_task():
        print('io start')
        await asyncio.sleep(6)
        print('io end')
        result = "hello"
        return result

    async def callback():
        await asyncio.sleep(4)
        if result is None:
            print('doing other things')

    awaited = await asyncio.gather(
        asyncio.create_task(some_task()),asyncio.create_task(callback()),)
    return awaited

asyncio.run(async_main())

Asyncio 可能非常令人困惑,我不建议非专家使用它,因此这里有一个使用 threading 代替 asyncio 的替代方法:

import threading
import time

def do_tasks():
    result = None

    def some_task():
        nonlocal result
        print('io start')
        time.sleep(2)
        print('io end')
        result = "hello"

    def callback():
        time.sleep(4)
        if result is None:
            print('doing other things')

    threading.Thread(target=some_task).start()
    threading.Thread(target=callback).start()

do_tasks()