当我在Python 3.5中启用asyncio调试时,我几乎每秒都会得到这样的消息:
INFO:asyncio:poll 999.470 ms took 1001.159 ms: timeout
INFO:asyncio:poll 999.264 ms took 1001.092 ms: timeout
INFO:asyncio:poll 999.454 ms took 1001.059 ms: timeout
这是一个重现此问题的最小代码:
import asyncio
import logging
logging.basicConfig(level=logging.DEBUG)
loop = asyncio.get_event_loop()
loop.set_debug(True)
async def f(delay):
for i in range(10):
await asyncio.sleep(delay)
loop.run_until_complete(f(0.5))
# (nothing printed)
loop.run_until_complete(f(1))
# INFO:asyncio:poll 999.470 ms took 1001.159 ms: timeout
# INFO:asyncio:poll 999.264 ms took 1001.092 ms: timeout
# INFO:asyncio:poll 999.454 ms took 1001.059 ms: timeout
# ...
loop.run_until_complete(f(2))
# INFO:asyncio:poll 1999.427 ms took 2001.112 ms: timeout
# INFO:asyncio:poll 1999.393 ms took 2001.088 ms: timeout
# INFO:asyncio:poll 1999.709 ms took 2001.758 ms: timeout
# ...
如果sleep
延迟小于1秒,则不会打印消息,但如果> = 1则不会打印消息。
这是预期的行为吗?我怎么能避免这样的消息?
使用Muffin framework时发现了这个问题。
答案 0 :(得分:5)
您可以为asyncio模块设置日志记录级别,例如:
logging.getLogger('asyncio').setLevel(logging.WARNING) # Remove asyncio debug and info messages, but leave warnings.
BTW,read about日志名称系统一般:
name
可能是一个以句点分隔的层次值,例如foo.bar.baz
(例如,它也可能只是普通foo
)。 分层列表中较低位的记录器是 记录器在列表中更高。例如,给定一个带有名称的记录器foo
的{{1}},名称为foo.bar
,foo.bar.baz
和foo.bam
的记录器foo
的所有后代。记录器名称层次结构类似于 Python包层次结构,如果你组织你的相同 基于每个模块的记录器使用推荐的结构logging.getLogger(__name__)
。那是因为在一个模块中,__name__
是 Python包命名空间中的模块名称。
答案 1 :(得分:4)
这是预期的行为吗?
是的,请参阅https://github.com/python/cpython/blob/v3.6.1/Lib/asyncio/base_events.py#L1372
如何避免此类消息?
显然,一种方法是禁用日志记录。或者您只能打印logging.DEBUG
级别。或者您可以编写某种custom filter来过滤掉这些消息。