python 版本:3.10.1 或 3.10.2
代码:
def main(): log_listener = setup_logging(log_filename) e = asyncio.Event() cOnsumer= Consumer(e) loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT) for sig in signals: loop.add_signal_handler( sig, lambda s=sig: asyncio.create_task(shutdown(s, loop, consumer)) ) tasks = consumer.run() try: for name, task in tasks.items(): loop.create_task(task, name=name) loop.run_forever() finally: loop.close() log_listener.stop() consumer.run() 方法会返回一个 Dict[str, Coroutine] 类型的字典。最初以为是自己的 coroutine 实现有问题导致 high CPU 。然后将 tasks 中的 coroutine 一个个移除,最后 tasks 返回空的情况下也是 100% CPU 。
用 cProfile 看了下:
Ordered by: cumulative time List reduced from 3038 to 10 due to restriction <10> ncalls tottime percall cumtime percall filename:lineno(function) 423/1 0.005 0.000 44.862 44.862 {built-in method builtins.exec} 1 0.000 0.000 44.862 44.862 myscript.py:1(<module>) 1 0.000 0.000 44.219 44.219 myscript.py:54(main) 1 0.000 0.000 44.017 44.017 /home/xxx/.pyenv/versions/3.10.1/lib/python3.10/asyncio/base_events.py:582(run_forever) 3 0.000 0.000 44.016 14.672 /home/xxx/.pyenv/versions/3.10.1/lib/python3.10/asyncio/base_events.py:1806(_run_once) 3 0.000 0.000 43.983 14.661 /home/xxx/.pyenv/versions/3.10.1/lib/python3.10/selectors.py:452(select) 3 43.983 14.661 43.983 14.661 {method 'poll' of 'select.epoll' objects} 484/4 0.006 0.000 0.642 0.161 <frozen importlib._bootstrap>:1022(_find_and_load) 483/4 0.003 0.000 0.642 0.161 <frozen importlib._bootstrap>:987(_find_and_load_unlocked) 447/5 0.003 0.000 0.641 0.128 <frozen importlib._bootstrap>:664(_load_unlocked) 有 v 友遇到类似情况的吗?还是说我的用法有问题。
