在 @gen.coroutine、@asyncio.coroutine 和异步之间,哪个 pyzmq 实现具有最快的吞吐量?

Which pyzmq implementation has the fastest throughput between @gen.coroutine, @asyncio.coroutine and async?

目前在 pzmq 中有多种方法可以实现文档中提到的异步 IO 循环。 http://pyzmq.readthedocs.io/en/latest/api/index.html

从纯粹的性能角度来看,文档中并不清楚这些选择是否等效。它们是:

那么,在文档示例中所示的典型 PUSH-PULL 场景中,哪个每秒消息吞吐量最高?为什么我们看到它们之间的区别?

结果

与我的预期相反,pyzmq 中的两个 asyncio 实现似乎都比 "legacy" tornado 慢。

龙卷风@gen.coroutine:

Avg. Speed: 2160.26 msg/s

本地@asyncio.coroutine:

Avg. Speed: 1697.66 msg/s

龙卷风异步:

Avg. Speed: 1695.29 msg/s

此外,这两个 asyncio 实现时不时地显示高达 3536.27 msg/s 的爆发,而 Tornado @gen.coroutine 的吞吐量非常稳定。

测试代码

为了进行比较,我使用了修改后的版本:

龙卷风@gen.coroutine: https://github.com/zeromq/pyzmq/blob/master/examples/eventloop/coroutines.py

原生@asyncio.coroutine: https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/coroutines.py

Tornado 异步:(Python 仅限 3.5+;包括额外的打印协程) https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/tornado_asyncio.py

修改包括每 5 秒显示每秒平均消息数而不是点。在 PULL 协程中,我递增 n = n + 1 然后在打印协程中我计算 v = n / (time.time() - start) 并显示它。此外,我每 10,000 条消息重置 n = 0start = time.time() 以防止测量中的任何偏移效应。

环境

$ uname -a
Linux localhost 4.6.3-300.fc24.x86_64 #1 SMP Fri Jun 24 20:52:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

$ python3 --version
Python 3.5.1

>>> zmq.__version__
'15.3.0'

>>> tornado.version
'4.3'