2016-12-14 26 views
1

これは私が試したものです:はasyncio.ensure_futureを使用してスタックトレースを取得できません()

>>> import asyncio 
>>> @asyncio.coroutine 
... def f(): 
... print("RUN") 
... raise Exception("ciao") 
... 
>>> asyncio.ensure_future(f()) 
<Task pending coro=<coro() running at /usr/lib/python3.4/asyncio/coroutines.py:139>> 
>>> loop = asyncio.get_event_loop() 
>>> loop.run_forever() 
RUN 

とスタックトレースは取得されません。 asyncio.run_until_complete(f())でコルーチンを実行しても問題はありません。

答えて

3

コルーチンの結果をどこかで待つ必要があり、そのコンテキストで例外が発生します。すべてのコルーチンは「待たれている」必要があります。 asyncio.run_until_complete()はそれを暗黙のうちに行いますが、run_forever()は実行できないので、永遠に実行することはできません。以下は、例外を(Python 3.5の構文を使用して)どのように見ることができるかの例です:

>>> import asyncio 
>>> import traceback 
>>> async def f(): 
...  raise Exception("Viva la revolución!") 
... 
>>> task_f = asyncio.ensure_future(f()) 
>>> async def g(): 
...  try: 
...   await task_f 
...  except Exception: 
...   traceback.print_exc() 
...   
>>> task_g = asyncio.ensure_future(g()) 
>>> asyncio.get_event_loop().run_forever() 
Traceback (most recent call last): 
    File "<ipython-input-5-0d9e3c563e35>", line 3, in g 
    await task_f 
    File "/usr/lib/python3.5/asyncio/futures.py", line 363, in __iter__ 
    return self.result() # May raise too. 
    File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result 
    raise self._exception 
    File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step 
    result = coro.send(None) 
    File "<ipython-input-3-928dc548dc3e>", line 2, in f 
    raise Exception("Viva la revolución!") 
Exception: Viva la revolución! 
+0

a + Viva la revolucion。 –

関連する問題