async def main_task(loop): tasks = [ loop.create_task(wait_task(i * 2, i)) for i in range(1, NUM_TASKS + 1) ] while True: demo.LOG('Waiting for any task to finish...') done, pending = await asyncio.wait(tasks, loop=loop, timeout=2, return_when=FIRST_COMPLETED) if not done: demo.LOG(' **TIMEOUT** ') continue for task in done: demo.LOG(f'task result: {task.result()}') tasks.remove(task) if not pending: break demo.LOG('all subordinate tasks completed; stopping event loop') loop.stop()
async def waiter(): demo.LOG_TASK_START('waiter') try: await asyncio.sleep(60) except asyncio.CancelledError: demo.LOG('** CANCELLED **') raise demo.LOG_TASK_END()
async def main(loop): async with aiohttp.ClientSession(loop=loop) as session: results = await asyncio.gather( fetch(session, 'http://python.org'), fetch(session, 'http://www.google.com'), fetch(session, 'http://pypi.python.org/pypi')) for result in results: demo.LOG(f'url={result[0]} status={result[1]} length={result[2]}')
async def thumper(): while True: await asyncio.sleep(1) demo.LOG('...thump')
import asyncio import demo async def get_a(): demo.LOG_TASK_START('get_a') await asyncio.sleep(2) demo.LOG_TASK_END() return 1 async def get_b(): demo.LOG_TASK_START('get_b') await asyncio.sleep(4) demo.LOG_TASK_END() return 2 async def parent(): result = await asyncio.gather(get_a(), get_b()) return result[0] + result[1] loop = asyncio.get_event_loop() result = loop.run_until_complete(parent()) loop.close() demo.LOG(f'result={result}')
async def get_value(timeout): await asyncio.sleep(timeout) demo.LOG('returning result') return 1234
""" Show how to get the result from a coroutine ... """ import asyncio import demo async def get_value(timeout): await asyncio.sleep(timeout) demo.LOG('returning result') return 1234 async def compute_value(): return await get_value(1) async def wait_task(): await asyncio.sleep(5) loop = asyncio.get_event_loop() calc_task = loop.create_task(compute_value()) wait_task = loop.create_task(wait_task()) loop.run_until_complete(wait_task) demo.LOG(f'result={calc_task.result()}')
async def main_task(loop): tasks = [ loop.create_task(wait_task(i * 2, i)) for i in range(1, NUM_TASKS + 1) ] while True: demo.LOG('Waiting for any task to finish...') done, pending = await asyncio.wait(tasks, loop=loop, return_when=FIRST_COMPLETED) for task in done: demo.LOG(f'task result: {task.result()}') tasks.remove(task) if not pending: break demo.LOG('all subordinate tasks completed; stopping event loop') loop.stop() if __name__ == '__main__': loop = asyncio.get_event_loop() loop.create_task(main_task(loop)) loop.run_forever() demo.LOG('eventloop terminated') loop.close()
def stop_writer(task): demo.LOG('Cancelling task...') task.cancel()
Cancel a running task Warning --- call_later takes a regular function not a coroutine """ import asyncio, demo async def waiter(): demo.LOG_TASK_START('waiter') try: await asyncio.sleep(60) except asyncio.CancelledError: demo.LOG('** CANCELLED **') raise demo.LOG_TASK_END() def stop_writer(task): demo.LOG('Cancelling task...') task.cancel() loop = asyncio.get_event_loop() fut = loop.create_task(waiter()) loop.call_later(5, stop_writer, fut) loop.run_until_complete(fut) demo.LOG(f'result={fut.result()}')
async def process_data(queue, ndx): while True: data = await queue.get() demo.LOG(f'processing data [{ndx}]: {data}') await asyncio.sleep(5)
async def read_data(queue): while True: await asyncio.sleep(1) data = randint(0, 1000) demo.LOG(f'adding data to queue... {data}; before queue len={queue.qsize()}') await queue.put(data)
async def stop_task(): await asyncio.sleep(10) demo.LOG('Stopping event loop...') loop = asyncio.get_event_loop() loop.stop()
Explicitly ending the event loop from a task ... """ import asyncio, demo async def waiter(): demo.LOG_TASK_START('waiter') try: await asyncio.sleep(60) except asyncio.CancelledError: demo.LOG('waiter **CANCELLED**') async def stop_task(): await asyncio.sleep(10) demo.LOG('Stopping event loop...') loop = asyncio.get_event_loop() loop.stop() loop = asyncio.get_event_loop() loop.create_task(stop_task()) loop.create_task(waiter()) demo.LOG('Starting event loop forever...') loop.run_forever() demo.LOG("Event loop terminated") loop.close()
async def get_value(timeout): await asyncio.sleep(timeout) demo.LOG('raising get_value error') raise Exception('get_value error')
""" import asyncio import demo async def get_value(timeout): await asyncio.sleep(timeout) return 1234 async def compute_value(): return await get_value(10) async def wait_task(): await asyncio.sleep(5) loop = asyncio.get_event_loop() calc_task = loop.create_task(compute_value()) wait_task = loop.create_task(wait_task()) loop.run_until_complete(wait_task) if calc_task.done(): demo.LOG(f'result={calc_task.result()}') else: demo.LOG(f'result is not ready yet')