基于SimPy的异步网络。

SimPy.IO-SemVer的Python项目详细描述


简单.io是一个基于SimPy的异步网络库。大自然 网络是完全基于事件的(例如,可以考虑消息 作为事件)。简单.ioSimPy的固体事件系统与 异步输入和输出。

它提供了几个不同程度的抽象(原始套接字、数据包和 请求-回复消息),支持各种后端((e)轮询、选择、异步, 虚拟)并允许您使用不同的套接字类型,如TCP、SSL加密, 模拟)。此外,还有HTTP、WebSockets和可扩展RPC等协议 也支持接口。

当前状态

Pipeline statusCoverage ReportLibraries statusLicense badgePyPI versionPython Versions

在简单.io目前正处于早期阿尔法发展阶段。没有 保证API的稳定性(模块几乎肯定会在 1.0版本)和简单.io你的系统可能会崩溃。可悲的是,没有 目前可用的文档(除了示例和测试)。

各个模块的状态如下:

  • 套接字:稳定alpha
  • 数据包:稳定alpha
  • 消息:稳定alpha
  • http:draft
  • websockets:draft
  • rpc:draft

下表表示支持矩阵。到现在为止,还没有CI 系统到位,以保证测试的稳定性。

SystemFlavorPythonBackendsSuccessful tests
LinuxArchLinux2.6.9, 2.7.6, 3.3, 3.4allall
LinuxUbuntu (12.04)2.6.9, 2.7.6, 3.3allmost
WindowsWindows 72.6.9, 2.7.6, 3.3selectall
OS XMaverick (10.9)3.3no epollmost

注意

Python2本身并不支持SimPy的所有特性(例如 异常链或生成器内部的返回语句)但解决方法 有。

安装

在简单.io需要Python2.7或3.3和Simpy3。您可以从 通过pip的Bitbucket:

$ pip install hg+https://bitbucket.org/simpy/simpy.io

示例

下面三个例子说明简单.io的抽象层次:

插座电平

直接与简单.io套接字,您可以尝试readwrite 从套接字或到套接字的指定字节数(注意没有 操作系统保证接收或传输所有数据):

^{pr2}$

包级别

在简单.io数据包减轻了原始套接字的限制,并允许您读取 写完整的数据包。它们可以是字节(如果使用Packet) 或(unicode)字符串(如果使用PacketUTF8):

>>>fromsimpy.ioimportselectasbackend>>>fromsimpy.io.packetimportPacket>>>>>>defserver(env,addr):...server_sock=backend.TCPSocket.server(env,addr)...sock=yieldserver_sock.accept()...packet=Packet(sock)...data=yieldpacket.read()...print(data.decode())...yieldpacket.write('cya'.encode())>>>>>>defclient(env,addr):...packet=Packet(backend.TCPSocket.connection(env,addr))...yieldpacket.write('ohai'.encode())...data=yieldpacket.read()...print(data.decode())>>>>>>addr=('127.0.0.1',5556)>>>env=backend.Environment()>>>srv=env.process(server(env,addr))>>>cli=env.process(client(env,addr))>>>env.run(until=cli)ohaicya

消息级别

消息级别添加允许异步发送的消息计数器 消息(甚至是并发的)并将响应映射到适当的请求。 此外,您可以指定(反)序列化程序(默认情况下,使用JSON)和 回复可以表示成功/失败:

>>>fromsimpy.ioimportselectasbackend>>>fromsimpy.io.packetimportPacketUTF8>>>fromsimpy.io.messageimportMessage>>>>>>defserver(env,addr):...server_sock=backend.TCPSocket.server(env,addr)...sock=yieldserver_sock.accept()...message=Message(env,PacketUTF8(sock))...request=yieldmessage.recv()...print(request.content)...yieldrequest.succeed('cya')>>>>>>defclient(env,addr):...message=Message(env,PacketUTF8(...backend.TCPSocket.connection(env,addr)))...reply=yieldmessage.send('ohai')...print(reply)>>>>>>addr=('127.0.0.1',5557)>>>env=backend.Environment()>>>srv=env.process(server(env,addr))>>>cli=env.process(client(env,addr))>>>env.run(until=cli)ohaicya

帮助和联系人

请随时向SimPy-Users mailing list留言询问 寻求帮助或讨论正在进行的发展。错误应该张贴在我们的 issue tracker在BitBucket上。

维护

更新ca证书和服务器密钥文件:

$ openssl req -x509 -nodes -newkey rsa:4096 -keyout server.key.pem -out certificate.pem -days 3650

验证ssl文件:

$ openssl x509 -days 3650 -text -noout -in certificate.pem

冻结要求:

$ .tox/py37/bin/python -m pip freeze –all –exclude-editable > requirements.txt

基准

$ python examples/benchmark.py async: 7693 messages of length 10 per 1 s means 7693 messages/s, which saturate 76.930 kilobyte/s or 0.615 megabit/s. poll: 8162 messages of length 10 per 1 s means 8162 messages/s, which saturate 81.620 kilobyte/s or 0.653 megabit/s. select: 8147 messages of length 10 per 1 s means 8147 messages/s, which saturate 81.470 kilobyte/s or 0.652 megabit/s. virtual: 8142 messages of length 10 per 1 s means 8142 messages/s, which saturate 81.420 kilobyte/s or 0.651 megabit/s.

压力测试

$ python examples/stress_test.py async: 5036 messages of length 16000 bytes per 1 s means 5036 messages/s, which saturate 80576.000 kilobyte/s or 644.608 megabit/s. poll: 5338 messages of length 16000 bytes per 1 s means 5338 messages/s, which saturate 85408.000 kilobyte/s or 683.264 megabit/s. select: 5255 messages of length 16000 bytes per 1 s means 5255 messages/s, which saturate 84080.000 kilobyte/s or 672.640 megabit/s. virtual: 4066 messages of length 16000 bytes per 1 s means 4066 messages/s, which saturate 65056.000 kilobyte/s or 520.448 megabit/s.

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

推荐PyPI第三方库


热门话题
java如何在点击JButton触发的进程仍在处理时更新JLabel?   try-catch为什么Java有嵌套的try语句?   java SSH命令执行失败,出现异常“net.schmizz.sshj.connection.ConnectionException:引发连接重置异常”   java在ApacheCamel的接口类解析器中,resolveMandatoryClass(字符串名称)有什么用途?   java如何在Eclipse远程调试器中找到有问题的线程?   java线程:containerlaunch退出代码127的异常   lambda左连接Java中的2个对象列表   Swift 2.0协议扩展和Java/C抽象类之间有区别吗?   安卓改造:使用GSON将JSON解析为多个Java对象   Spring中服务层的java角色(澄清)   html Java与网站的通信   Spring boot rest api是在不创建java类的情况下将getResultList()转换为映射以显示响应的最佳方法吗?   使用“getElementById”从javascript获取值到java   java如何在文本视图中以粗体和多色显示文本   java是设置TextView颜色的最有效方法