目前在 pzmq 中有多种方法来实现文档中提到的异步 IO 循环。
http://pyzmq.readthedocs.io/en/latest/api/index.html
从纯性能的角度来看,文档中并不清楚这些选择是否等效。这些是:
那么,如文档示例中所示,在典型的 PUSH-PULL 场景中,哪一个具有最佳的每秒消息吞吐量?为什么我们会看到它们之间的差异?
最佳答案
结果
与我的预期相反,pyzmq 中的两个 asyncio 实现似乎都比“传统” Tornado 实现慢。
Tornado @gen.coroutine:
Avg. Speed: 2160.26 msg/s
原生@asyncio.coroutine:
Avg. Speed: 1697.66 msg/s
Tornado 异步:
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
原生@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)
并显示它。也在那里,我重置了 n = 0
和 start = time.time()
每 10,000 条消息,以防止测量中的任何偏移影响。环境
$ 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'
关于performance - 哪个 pyzmq 实现在 @gen.coroutine、@asyncio.coroutine 和 async 之间具有最快的吞吐量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38422119/