我正在运行一个相当复杂的Tornado TCP服务器应用程序,并且我想了解花费时间以提高性能。我正在使用Tornado v5 +,因此Tornado得到了asyncio的支持。
我在事件循环线程上运行了一个统计探查器,发现像下面这样的堆栈是常见的:
tornado/ioloop.py::run_sync
asyncio/asyncio.py::start
asyncio/base_events.py::run_forever
asyncio/base_events.py::_run_once
asyncio/events.py::_run
torando/ioloop.py::<lambda>
torando/platform/asyncio.py::add_callback
asyncio/base_events.py::call_soon_threadsafe
asyncio/selector_events.py::_write_to_self
csock.send(b'\0')
和
tornado/ioloop.py::run_sync
asyncio/asyncio.py::start
asyncio/base_events.py::run_forever
asyncio/base_events.py::_run_once
asyncio/events.py::selector_events.py::_read_from_self
data = self._ssock_recv(4096)
无论处于活动状态还是安静状态,这些时间都会占用大约40%的计算时间。我应该担心它们吗,还是这些只是等待系统状态发生的等待状态?
答案 0 :(得分:2)
每当使用IOLoop.add_callback
时,这两个堆栈总是成对出现。这不是一个空闲状态,它是开销,并且不希望它占用40%的时间。其他60%的时间应该可以为您提供提示。在我看来,您可能遇到了某种无限循环或运行着一系列无限次协同程序的问题。
答案 1 :(得分:0)