ちょうど混乱を避けるために:私はあなたがasyncio.Taskについて話していないと思いますが、代わりにいくつかの可変状態、右か?
Futureとsynchronization primitivesを使用すると、非同期的に変更されたものを待つことができます。
2つの状態を切り替える必要がある場合は、おそらくasyncio.Eventが必要です。ここで少しexamleです:
import asyncio
my_task = asyncio.Event()
def done():
my_task.set()
async def wait_until_done():
await my_task.wait() # await until event would be .set()
print("Finally, the task is done")
async def main():
loop.call_later(delay=5, callback=done)
await wait_until_done()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
UPD:LongTask
インタフェース続け
より複雑な例:
import asyncio
class LongTask:
_event = asyncio.Event()
@property
def state(self):
return 'PENDING' if not type(self)._event.is_set() else 'DONE'
@state.setter
def state(self, val):
if val == 'PENDING':
type(self)._event.clear()
elif val == 'DONE':
type(self)._event.set()
else:
raise ValueError('Bad state value.')
async def is_done(self):
return (await type(self)._event.wait())
my_task = LongTask()
def done():
my_task.state = 'DONE'
async def wait_until_done():
await my_task.is_done()
print("Finally, the task is done")
async def main():
loop.call_later(delay=5, callback=done)
await wait_until_done()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(main())
finally:
loop.run_until_complete(loop.shutdown_asyncgens())
loop.close()
Observerパターンは、使用したいものと考えられます。オブジェクトを「観測可能」にすると、オブザーバとしてオブザーバとしてハンドラを登録するので、状態が変化したときに、これまでどんなメソッドを呼び出すかが決まります。 https://stackoverflow.com/questions/1904351/python-observer-pattern-examples-tips – Rob