目前在pzmq中有多种方法可以实现文档中提到的异步IO循环。 http://pyzmq.readthedocs.io/en/latest/api/index.html
从纯粹的性能角度来看,文档中不清楚选择是否相同。这些是:
那么,在典型的PUSH-PULL场景中,哪一个在每秒消息中具有最佳吞吐量,如文档示例所示?为什么我们看到它们之间存在差异?
答案 0 :(得分:3)
与我的预期相反,似乎pyzmq中的asyncio实现比“遗留”龙卷风更慢。
Tornado @ gen.coroutine:
Avg. Speed: 2160.26 msg/s
Native @ asyncio.coroutine:
Avg. Speed: 1697.66 msg/s
龙卷风异步:
Avg. Speed: 1695.29 msg/s
此外,两个asyncio实现时不时地显示高达3536.27 msg / s的突发,而Tornado @ gen.coroutine的吞吐量非常稳定。
为了比较,我使用了以下的修改版本:
Tornado @ gen.coroutine: https://github.com/zeromq/pyzmq/blob/master/examples/eventloop/coroutines.py
Native @ asyncio.coroutine: https://github.com/zeromq/pyzmq/blob/master/examples/asyncio/coroutines.py
龙卷风异步:(仅限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 = 0
和start = 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'