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

时间:2016-07-17 14:10:44

标签: performance python-3.x tornado zeromq pyzmq

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

从纯粹的性能角度来看,文档中不清楚选择是否相同。这些是:

  • Tornado @ gen.coroutine
  • Native @ asyncio.coroutine
  • Tornado async

那么,在典型的PUSH-PULL场景中,哪一个在每秒消息中具有最佳吞吐量,如文档示例所示?为什么我们看到它们之间存在差异?

1 个答案:

答案 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 = 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'