私は、call_later
を使用してPython 3.4のasyncioで作られた簡単なコードコードを持っています。コードは10秒間待機し、印刷してから、再度印刷する必要があります(その代わり、end()
がexcecutedしなければならないときTypeError
上げ、下記を参照してください):どのような私ができることからasyncioのcall_laterは、コルーチンオブジェクトで呼び出すことができません
Exception in callback <generator object coro at 0x7fc88eeaddc8>()
handle: <TimerHandle when=31677.188005054 <generator object coro at 0x7fc88eeaddc8>()>
Traceback (most recent call last):
File "/usr/lib64/python3.4/asyncio/events.py", line 119, in _run
self._callback(*self._args)
TypeError: 'generator' object is not callable
:
import asyncio
@asyncio.coroutine
def begin():
print("Starting to wait.")
asyncio.get_event_loop().call_later(10, end())
@asyncio.coroutine
def end():
print("completed")
if __name__ == "__main__":
try:
loop = asyncio.get_event_loop()
loop.create_task(begin())
loop.run_forever()
except KeyboardInterrupt:
print("Goodbye!")
はエラーになりますドキュメント(https://docs.python.org/3/library/asyncio-task.html#coroutine)から、call_later
はコルーチン関数を呼び出すことによって得られるコルーチンオブジェクトを受け取ります。これは私がやったようだが、asyncioはend()
を正しく呼んでいない。
どうすればいいですか?
、後で 'asyncio'と呼ばれるコルーチンをスケジュールする方法はありますか?または、これが意味をなさない理由がいくつかありますか? –
@ NathanaelFarleyさて、あなたは 'call_later(10、lambda:asyncio.ensure_future(end()))'を使うことができます。しかし 'asyncio.sleep(10)'からのyieldを 'begin'の中に入れ、その直後に' yield from end() 'を呼び出すほうが意味があります。 'begin'をブロックしたくない場合は、' asyncio.sleep'を入れて別のコルーチンに 'end'を呼ぶだけで、' begin'の中に 'asyncio.ensure_future(other_coroutine())'を呼び出すことができます。 – dano