Rdbhost
Rdbhost

Reputation: 1009

Python asyncio debugging example

I would like to enable Asyncio's un-yielded coroutine detection, but have not succeeded.

This simple code implements the recommendations on:
https://docs.python.org/3/library/asyncio-dev.html#asyncio-logger

but does not actually catch the un-yielded 'dummy' coroutine.

import sys, os
import asyncio
import logging
import warnings

os.environ['PYTHONASYNCIODEBUG'] = '1'
logging.basicConfig(level=logging.DEBUG)
warnings.resetwarnings()

@asyncio.coroutine
def dummy():
    print('yeah, dummy ran!!')

@asyncio.coroutine
def startdummy():
    print('creating dummy')
    dummy()

if __name__ == '__main__':
    lp = asyncio.get_event_loop()
    lp.run_until_complete(startdummy())

I expected that the program would end with a warning about the coroutine 'dummy', created but not yielded from.

Actually, results are:

DEBUG:asyncio:Using selector: SelectSelector
creating dummy
sys:1: ResourceWarning: unclosed <socket object at 0x02DCB6F0>
c:\python34\lib\importlib\_bootstrap.py:2150: ImportWarning: sys.meta_path is empty
sys:1: ResourceWarning: unclosed <socket object at 0x02DE10C0>

No hint of an abandoned coroutine. What am I missing?

Upvotes: 23

Views: 23192

Answers (1)

Andrew Svetlov
Andrew Svetlov

Reputation: 17376

asyncio performs check for PYTHONASYNCIODEBUG on module importing.

Thus you need setup environment variable before very first asyncio import:

import os
os.environ['PYTHONASYNCIODEBUG'] = '1'
import asyncio

# rest of your file

Upvotes: 33

Related Questions