与并发无关的套接字API

sockio的Python项目详细描述


索奇奥

Pypi version

一个python并发无关的socket库。在

spec in action

在处理通过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比较时 以下功能不再可用:

  1. 独立控制插座两端的能力 (例如:关闭写入端)
  2. 当到达EOF时,低级socket.recv()返回空字符串, TCP类将提升ConnectionEOFError,并关闭 连接。在
  3. 聪明的低级操作,如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_madeconnection_losteof_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兼容性模块中使用。告诉我 如果你需要的话就写一期。也可以随意做公关!在

缺少的功能

  • 连接重试
  • 三重事件循环
  • 古玩事件循环

加入党,带来你自己的并发库与公关!在

我特别寻找三重奏和古董实现。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java中的第10个解决方案   Java中泛型的super和extends组合   Java Android OpenGL ES 2.0片段着色器texture2D不工作   在JList elementJava上按下时打开弹出窗口   字典Java数据结构允许对象上的布尔标志和排序?   java我该如何停止为AWS关系数据库服务收费?   java如何检查Google定位准确度是否提高?   java使用Mockito将方法存根在与被测类相同的类中(CUT)   java IntelliJIdea disable inspection:参数的实际值始终为   java CXF+多态POST数据   java命名空间“ads”未绑定   Sun(1999)的“Java编程语言的代码约定”的编码风格过时了吗?   JAVA中的隐式接口、类转换   javafx如何配置Java登录应用程序代码   java如何在滚动窗格中设置选项卡以及如何显示选项卡标题   java中等式和条件运算符的优先级   java Spring WS无法返回JAXB响应   错误响应上的java jaxws处理程序行为   java Hibernate HQL映射查询