运行 一个没有阻塞父协程的子协程
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
任何挂起动作才能让其他任务(包括子协程任务)运行.
我是 运行 一个循环收听来自 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
任何挂起动作才能让其他任务(包括子协程任务)运行.