How can I wrap a synchronous function in an async coroutine?

Eventually I found an answer in this thread. The method I was looking for is run_in_executor. This allows a synchronous function to be run asynchronously without blocking an event loop. In the sleep example I posted above, it might look like this: import asyncio from time import sleep async def sleep_async(loop, delay): # None uses … Read more

Combine awaitables like Promise.all

The equivalent would be using asyncio.gather: import asyncio async def bar(i): print(‘started’, i) await asyncio.sleep(1) print(‘finished’, i) async def main(): await asyncio.gather(*[bar(i) for i in range(10)]) loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close() Why doesn’t my approach work? Because when you await each item in seq, you block that coroutine. So in essence, you have synchronous code … Read more

How can I periodically execute a function with asyncio?

For Python versions below 3.5: import asyncio @asyncio.coroutine def periodic(): while True: print(‘periodic’) yield from asyncio.sleep(1) def stop(): task.cancel() loop = asyncio.get_event_loop() loop.call_later(5, stop) task = loop.create_task(periodic()) try: loop.run_until_complete(task) except asyncio.CancelledError: pass For Python 3.5 and above: import asyncio async def periodic(): while True: print(‘periodic’) await asyncio.sleep(1) def stop(): task.cancel() loop = asyncio.get_event_loop() loop.call_later(5, stop) … Read more

asyncio.sleep() vs time.sleep()

You aren’t seeing anything special because there’s nothing much asynchronous work in your code. However, the main difference is that time.sleep(5) is blocking, and asyncio.sleep(5) is non-blocking. When time.sleep(5) is called, it will block the entire execution of the script and it will be put on hold, just frozen, doing nothing. But when you call … Read more

How to limit concurrency with Python asyncio?

If I’m not mistaken you’re searching for asyncio.Semaphore. Example of usage: import asyncio from random import randint async def download(code): wait_time = randint(1, 3) print(‘downloading {} will take {} second(s)’.format(code, wait_time)) await asyncio.sleep(wait_time) # I/O, context will switch to main function print(‘downloaded {}’.format(code)) sem = asyncio.Semaphore(3) async def safe_download(i): async with sem: # semaphore limits … Read more

What is the core difference between asyncio and trio?

Where I’m coming from: I’m the primary author of trio. I’m also one of the top contributors to curio (and wrote the article about it that you link to), and a Python core dev who’s been heavily involved in discussions about how to improve asyncio. In trio (and curio), one of the core design principles … Read more

“asyncio.run() cannot be called from a running event loop” when using Jupyter Notebook

The asyncio.run() documentation says: This function cannot be called when another asyncio event loop is running in the same thread. In your case, jupyter (IPython ≥ 7.0) is already running an event loop: You can now use async/await at the top level in the IPython terminal and in the notebook, it should — in most of the … Read more