Skip to main content

Asynchronous networking based on SimPy.

Project description

simpy.io is an asynchronous networking library based on SimPy. The nature of networking is thoroughly event-based (messages can for example be thought of as events). simpy.io marries the solid event system of SimPy with asynchronous input and output.

It provides several degrees of abstraction (raw sockets, packets and request-reply messages), supports various back-ends ((e)poll, select, asyncore, virtual) and lets you use different socket types, like TCP, SSL-encrypted, simulated). Furthermore protocols like HTTP, WebSockets and an extensible RPC interface are also supported.

Current status

simpy.io is currently in the early alpha phase of development. There is no guarantee for API stability (modules will almost certainly be renamed before the 1.0 release) and simpy.io may break on your system. Sadly, there isn’t any documentation available as of now (apart from the examples and tests).

The state of the individual modules is as follows:

  • sockets: stable alpha

  • packets: stable alpha

  • message: stable alpha

  • http: draft

  • websockets: draft

  • rpc: draft

The following table represents the support matrix. As of now, there’s no CI system in place to guarantee the test stability, yet.

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

Installation

simpy.io requires Python 2.7 or 3.3 and SimPy 3. You can install it from Bitbucket via pip:

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

Examples

The following three examples demonstrate simpy.io’s levels of abstraction:

Socket level

When working directly with simpy.io sockets, you can try to read and write a specified number of bytes from or to a socket (note that there is no guarantee from the OS that all data will be received or transmitted):

>>> from simpy.io import select as backend
>>>
>>> def server(env, addr):
...     server_sock = backend.TCPSocket.server(env, addr)
...     sock = yield server_sock.accept()
...     data = yield sock.read(4)
...     print(data.decode())
...     yield sock.write('cya'.encode())
>>>
>>> def client(env, addr):
...     sock = backend.TCPSocket.connection(env, addr)
...     yield sock.write('ohai'.encode())
...     data = yield sock.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)
ohai
cya

Packet level

simpy.io packets alleviate the limitation of raw sockets and allow you to read and write complete packets. These can either be bytes (if you use Packet) or (unicode) strings (if you use PacketUTF8):

>>> from simpy.io import select as backend
>>> from simpy.io.packet import Packet
>>>
>>> def server(env, addr):
...     server_sock = backend.TCPSocket.server(env, addr)
...     sock = yield server_sock.accept()
...     packet = Packet(sock)
...     data = yield packet.read()
...     print(data.decode())
...     yield packet.write('cya'.encode())
>>>
>>> def client(env, addr):
...     packet = Packet(backend.TCPSocket.connection(env, addr))
...     yield packet.write('ohai'.encode())
...     data = yield packet.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)
ohai
cya

Message level

The message level adds message counters that allow you to asynchronously send messages (even concurrently) and maps replies to their proper requests. Furthermore, you can specify (de)serializers (by default, JSON is used) and replies can signal success/failure:

>>> from simpy.io import select as backend
>>> from simpy.io.packet import PacketUTF8
>>> from simpy.io.message import Message
>>>
>>> def server(env, addr):
...     server_sock = backend.TCPSocket.server(env, addr)
...     sock = yield server_sock.accept()
...     message = Message(env, PacketUTF8(sock))
...     request = yield message.recv()
...     print(request.content)
...     yield request.succeed('cya')
>>>
>>> def client(env, addr):
...     message = Message(env, PacketUTF8(
...             backend.TCPSocket.connection(env, addr)))
...     reply = yield message.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)
ohai
cya

Help & Contact

Please feel free to post a message to the SimPy-Users mailing list to ask for help or to discuss the ongoing development. Bugs should be posted on our issue tracker here on BitBucket.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

simpy.io-0.2.1.tar.gz (43.4 kB view details)

Uploaded Source

Built Distribution

simpy.io-0.2.1-py2.py3-none-any.whl (71.3 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file simpy.io-0.2.1.tar.gz.

File metadata

  • Download URL: simpy.io-0.2.1.tar.gz
  • Upload date:
  • Size: 43.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for simpy.io-0.2.1.tar.gz
Algorithm Hash digest
SHA256 b0d42ccb6dab0065a105cb3c1e47b7457cae86fefa23e47a3355068b0e26af59
MD5 064944e3db16fe3789877878a8425cb0
BLAKE2b-256 8d16fe4f1ac8b05b6dc320bcad9702f2239b923733093dbdd792ba20dde3e3e9

See more details on using hashes here.

Provenance

File details

Details for the file simpy.io-0.2.1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for simpy.io-0.2.1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 6f9ccc12f60b0a86cb877962600dd41b269b4224d263fad5b8eacd69de69c0bb
MD5 324cffb587e39373a8d2002d52c356aa
BLAKE2b-256 66c819a56e09fb2af077d780eebcce626e86bfbfd6a4fdd3bd8f8060c381ca35

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page