运行 一个没有阻塞父协程的子协程

Run a Child Coroutine without Blocking Parent Coroutine

我是 运行 一个循环收听来自 API 的信息的人。当我从 API 收到任何响应时,我想调用一个会休眠几秒钟的子协程,然后处理信息并将其发送到我的 Telegram 帐户,这个子协程不能是非异步的。

我想继续收听 API,而不阻塞处理信息。 处理应该在后台完成。这可以通过线程来完成,但我看到很多人说,Asyncio 和线程在同一个地方不是一件好事。

一个简化的代码片段:-

import asyncio
import time

loop = asyncio.get_event_loop()

async def ParentProcess():
    async def ChildProcess(sleep):
        await asyncio.sleep(sleep)
        print("Slept", sleep, "Sec(s).")
        await ScheduleCheck()

    for i in range(5):
       print("Continue")
       await ChildProcess(5)
       print("Continue")
        
        
loop.run_until_complete(ParentProcess())

# Expected Output :- 
# Continue
# Continue
# Slept 5 Sec(s).

感谢您的关注。

相当于asyncio中的“后台线程”是一个任务。使用 asyncio.create_task 安排协程在后台执行,await 任务暂停直到完成。

    while True:
        async for i in stream():
            print("Continue")
            # spawn task in the background
            background_task = asyncio.create_task(ChildProcess(5))
            print("Continue")
            # wait for task to complete
            await background_task
    
        await asyncio.sleep(2)

请注意,await执行任务是可选的——它仍将 运行 由事件循环完成。但是父协程必须await任何挂起动作才能让其他任务(包括子协程任务)运行.