I'm trying to test if I'm correctly using an asyncio library (aiofiles) to see if its blocking.
How can I do this? My idea was to have an infinite loop of asyncio.sleep checking the delay between each call, while I try to insert a blocking call in between
This is my current try, but blocking is never called, I'm assuming the problem is that the infinite loop is actually also blocking.
from asyncio import sleep, get_event_loop
import time
async def test_blocking():
  while True:
    timea = time.time()
    await sleep(1)
    timeb = time.time() - timea
    delay = timeb - 1.00
    if delay >= 0.01:
      print(f'Function blocked by {delay}s')
async def blocking():
  print('Running blocking function')
  time.sleep(5)
loop = get_event_loop()
loop.run_until_complete(test_blocking())
loop.run_until_complete(blocking())
Your test_blocking coroutine is not actually blocking the event loop - it's implemented correctly. However, run_until_complete is a blocking call. So your script is never actually making it to the run_until_complete(blocking()) line - it's waiting for test_blocking to return, which never happens because it's an infinite loop. Use loop.create_task instead, and you'll see the behavior you expect.
Also, you may want to consider using asyncio's debug mode to achieve what you're trying to do here. When enabled, it can alert you when a particular callback takes longer than a given amount of time:
Callbacks taking longer than 100ms are logged. The
loop.slow_callback_durationattribute can be used to set the minimum execution duration in seconds that is considered “slow”.
When enabled on your test script, it prints this:
Executing <Task finished name='Task-2' coro=<blocking() done, defined at a.py:13> result=None created at /home/dan/.pyenv/versions/3.8.3/lib/python3.8/asyncio/base_events.py:595> took 5.005 seconds
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With