与并发无关的套接字API
sockio的Python项目详细描述
索奇奥
一个python并发无关的socket库。在
在处理通过TCP和 简单的REQ-REP通信协议(示例: SCPI)。在
到目前为止,使用自动重新连接工具实现了REQ-REP和流式语义。在
使用asyncio编写的基本实现,支持不同的并发模型:
- 异步
- 经典阻塞API
- 基于未来的API
- Python2兼容的阻塞API(适用于那些坚持使用Python2的倾倒灵魂)
安装
在您最喜欢的python环境中:
pip install sockio
使用
asyncio
^{pr2}$classic
fromsockio.sioimportTCPsock=TCP('acme.example.com',5000)reply=sock.write_readline(b'*IDN?\n')print(reply)
同期期货
fromsockio.sioimportTCPsock=TCP('acme.example.com',5000,resolve_futures=False)reply=sock.write_readline(b'*IDN?\n').result()print(reply)
python 2兼容性
fromsockio.py2importTCPsock=TCP('acme.example.com',5000)reply=sock.write_readline(b'*IDN?\n').result()print(reply)
特点
sockio-TCP对象的主要目标是促进通信 使用监听TCP套接字的仪器。在
最常见的情况包括需要REQ/REP的仪器 语义与ASCII协议,如SCPI。在这些情况下,大多数命令 在主机和 仪器。这个图书馆已经注意到要减少 尽可能延迟。这转化为以下默认值 创建TCP对象时:
- TCP无延迟处于活动状态。可以使用
TCP(..., no_delay=False)
禁用。 这会阻止内核应用 Nagle's algorithm - TCP ToS设置为LOWDELAY。这样可以有效地区分数据包的优先级
如果有利于其他并发通信。可以使用禁用
TCP(tos=IPTOS_NORMAL)
支付价格
在详细介绍这些特性之前,请注意这个抽象 有代价的。有意地,当与低级套接字API比较时 以下功能不再可用:
- 独立控制插座两端的能力 (例如:关闭写入端)
- 当到达EOF时,低级
socket.recv()
返回空字符串, TCP类将提升ConnectionEOFError
,并关闭 连接。在 - 聪明的低级操作,如
os.dup()
,使套接字不阻塞
REQ-REP语义
很多仪器都有请求-应答协议。sockio TCP协议
提供write_read
族的方法,这些方法简化了与
这些仪器。这些方法是原子的,这意味着不同的任务或
线程可以安全地使用同一个套接字对象(尽管我会
问自己为什么要在我的库/应用程序中这样做)。在
自动重新连接
sock=TCP('acme.example.com',5000)reply=awaitsock.write_readline(b'*IDN?\n')print(reply)# ... kill the server connection somehow and bring it back to life again# You can use the same socket object. It will reconnect automatically# and work "transparently"reply=awaitsock.write_readline(b'*IDN?\n')print(reply)
例如,当您 将装备从一个地方移到另一个地方,否则你需要关闭 夜间设备(地球感谢你节约能源!)。在
超时
TCP构造函数提供一个connection_timeout
,当
连接已打开,并且要考虑timeout
参数
执行任何数据I/O操作时(读、写、读写线,
等等)。
默认情况下,它们都是None,这意味着无限超时。在
sock=TCP('acme.example.com',5000,connection_timeout=0.1,timeout=1)
此外,还可以覆盖每个数据I/O方法的对象超时 通过提供备用超时参数调用:
sock=TCP('acme.example.com',5000,timeout=1)# the next call will raise asyncio.TimeoutError if it takes more than 0.1sreply=awaitsock.write_readline(b'*IDN?\n',timeout=0.1)print(reply)
自定义下线
在基于行的协议中,有时人们会认为\n
不是一个好的下线字符。
可以使用不同的下线字符自定义sockio TCP。示例:
sock=TCP('acme.example.com',5000,eol=b'\r')
EOL字符可以在任何readline
方法中被覆盖。示例:
awaitsock.write_readline(b'*IDN?\n',eol=b'\r')
连接事件回调
您可以在connection_made
、connection_lost
和eof_received
事件中得到通知
通过在sockio TCP构造函数上注册回调
例如,如果您希望特定的过程 每次重新连接套接字时执行,以确保配置是 正确的。示例:
asyncdefconnected():awaitsock.write(b'ACQU:TRIGGER HARDWARE\n')awaitsock.write(b'DISPLAY OFF\n')sock=TCP('acme.example.com',5000,on_connection_made=connected)
(见示例/需求报告/客户端.py)在
连接事件回调not可在python 2兼容性模块中使用。在
流
sockio tcp是异步iterable对象。这意味着线流 简单到:
sock=TCP('acme.example.com',5000,eol=b'\r')asyncforlineinsock:print(line)
流not可在python 2兼容性模块中使用。告诉我 如果你需要的话就写一期。也可以随意做公关!在
缺少的功能
- 连接重试
- 三重事件循环
- 古玩事件循环
加入党,带来你自己的并发库与公关!在
我特别寻找三重奏和古董实现。在
- 项目
标签: