基于simpy的异步网络。
simpy.io的Python项目详细描述
simpy.io是一个基于SimPy的异步网络库。自然 网络是完全基于事件的(例如,可以考虑消息 作为事件)。simpy.io与 异步输入和输出。
它提供了几个抽象级别(原始套接字、数据包和 请求回复消息),支持各种后端((e)poll、select、asyncore, 并允许您使用不同的套接字类型,如TCP、SSL加密, 模拟的)。此外,还有http、websockets和可扩展rpc等协议 也支持接口。
当前状态
simpy.io目前处于开发的早期alpha阶段。没有 保证API的稳定性(模块几乎肯定会在 1.0版本)和simpy.io可能会在您的系统上崩溃。可悲的是,没有 目前可用的文档(除了示例和测试)。
各个模块的状态如下:
- 套接字:稳定的alpha
- 数据包:稳定的alpha
- 消息:稳定的alpha
- http:draft
- websockets:draft
- rpc:draft
下表表示支持矩阵。到现在为止,没有ci 系统到位,保证了测试的稳定性。
System | Flavor | Python | Backends | Successful tests |
---|---|---|---|---|
Linux | ArchLinux | 2.6.9, 2.7.6, 3.3, 3.4 | all | all |
Linux | Ubuntu (12.04) | 2.6.9, 2.7.6, 3.3 | all | most |
Windows | Windows 7 | 2.6.9, 2.7.6, 3.3 | select | all |
OS X | Maverick (10.9) | 3.3 | no epoll | most |
注意
python 2本身并不支持simpy的所有特性(例如不支持 异常链或生成器内部的返回语句),但解决方法 有空。
安装
simpy.io需要python 2.7或3.3和simpy 3。您可以从安装 通过PIP的位桶:
$ pip install hg+https://bitbucket.org/simpy/simpy.io
示例
以下三个示例演示simpy.io的抽象级别:
插座水平
直接使用simpy.io套接字时,可以尝试read和write 从套接字或到套接字的指定字节数(注意 从操作系统保证接收或传输所有数据:
>>>fromsimpy.ioimportselectasbackend>>>>>>defserver(env,addr):...server_sock=backend.TCPSocket.server(env,addr)...sock=yieldserver_sock.accept()...data=yieldsock.read(4)...print(data.decode())...yieldsock.write('cya'.encode())>>>>>>defclient(env,addr):...sock=backend.TCPSocket.connection(env,addr)...yieldsock.write('ohai'.encode())...data=yieldsock.read(3)...print(data.decode())>>>>>>addr=('127.0.0.1',5555)>>>env=backend.Environment()>>>srv=env.process(server(env,addr))>>>cli=env.process(client(env,addr))>>>env.run(until=cli)ohaicya
数据包级别
simpy.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这里是比特桶。