Python asyncio 等待并通知
Python asyncio wait and notify
我正在尝试做类似 C# ManualResetEvent 的事情,但是在 Python.
我曾尝试在 python 中执行此操作,但似乎没有用。
import asyncio
cond = asyncio.Condition()
async def main():
some_method()
cond.notify()
async def some_method():
print("Starting...")
await cond.acquire()
await cond.wait()
cond.release()
print("Finshed...")
main()
我想让 some_method 启动,然后等到发出再次启动的信号。
此代码不完整,首先您需要使用 asyncio.run()
到 bootstrap 事件循环 - 这就是您的代码根本不是 运行 的原因。
其次,some_method()
从未真正开始。您需要使用 asyncio.create_task()
异步启动 some_method()
。当你调用一个“async def
函数”(更正确的术语是协程函数)时,它 returns 一个协程对象,这个对象需要由你 await
的事件循环驱动或使用 before-mentioned 函数。
您的代码应该更像这样:
import asyncio
async def main():
cond = asyncio.Condition()
t = asyncio.create_task(some_method(cond))
# The event loop hasn't had any time to start the task
# until you await again. Sleeping for 0 seconds will let
# the event loop start the task before continuing.
await asyncio.sleep(0)
cond.notify()
# You should never really "fire and forget" tasks,
# the same way you never do with threading. Wait for
# it to complete before returning:
await t
async def some_method(cond):
print("Starting...")
await cond.acquire()
await cond.wait()
cond.release()
print("Finshed...")
asyncio.run(main())
我正在尝试做类似 C# ManualResetEvent 的事情,但是在 Python.
我曾尝试在 python 中执行此操作,但似乎没有用。
import asyncio
cond = asyncio.Condition()
async def main():
some_method()
cond.notify()
async def some_method():
print("Starting...")
await cond.acquire()
await cond.wait()
cond.release()
print("Finshed...")
main()
我想让 some_method 启动,然后等到发出再次启动的信号。
此代码不完整,首先您需要使用 asyncio.run()
到 bootstrap 事件循环 - 这就是您的代码根本不是 运行 的原因。
其次,some_method()
从未真正开始。您需要使用 asyncio.create_task()
异步启动 some_method()
。当你调用一个“async def
函数”(更正确的术语是协程函数)时,它 returns 一个协程对象,这个对象需要由你 await
的事件循环驱动或使用 before-mentioned 函数。
您的代码应该更像这样:
import asyncio
async def main():
cond = asyncio.Condition()
t = asyncio.create_task(some_method(cond))
# The event loop hasn't had any time to start the task
# until you await again. Sleeping for 0 seconds will let
# the event loop start the task before continuing.
await asyncio.sleep(0)
cond.notify()
# You should never really "fire and forget" tasks,
# the same way you never do with threading. Wait for
# it to complete before returning:
await t
async def some_method(cond):
print("Starting...")
await cond.acquire()
await cond.wait()
cond.release()
print("Finshed...")
asyncio.run(main())