ensure_future
- crea solo Task
e torna immediatamente. Si dovrebbe attendere per attività creata per farlo è risultato (compreso caso quando si solleva eccezione):
import asyncio
async def test():
await asyncio.sleep(0)
raise ValueError('123')
async def main():
try:
task = asyncio.ensure_future(test()) # Task aren't finished here yet
await task # Here we await for task finished and here exception would be raised
except ValueError as e:
print(repr(e))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
uscita:
ValueError('123',)
Nel caso in cui non si ha intenzione di attendere immediatamente compito dopo averlo creato , si potrebbe attendere in un secondo momento (per sapere come è finita):
async def main():
task = asyncio.ensure_future(test())
await asyncio.sleep(1)
# At this moment task finished with exception,
# but we didn't retrieved it's exception.
# We can do it just awaiting task:
try:
await task
except ValueError as e:
print(repr(e))
uscita è lo stesso:
ValueError('123',)
fonte
2016-05-03 12:08:59
Grazie. Sai anche come catturare le eccezioni con 'call_soon_threadsafe()'? –
@MarcoSulla scusa, non lo so. Un modo che vedo è usare wrapper per gestire l'eccezione nel callback: http://pastebin.com/rNyTWMBk ma non so se è un modo comune per farlo. –