https://github.com/mryslab/python_banyan
A lightweight, reactive framework used to create flexible, non-blocking, event driven, asynchronous applications.
https://github.com/mryslab/python_banyan
asynchronous-applications banyan-protocol-message python3
Last synced: 9 months ago
JSON representation
A lightweight, reactive framework used to create flexible, non-blocking, event driven, asynchronous applications.
- Host: GitHub
- URL: https://github.com/mryslab/python_banyan
- Owner: MrYsLab
- License: agpl-3.0
- Created: 2016-12-26T21:02:43.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-11-20T20:32:25.000Z (over 3 years ago)
- Last Synced: 2024-04-29T20:51:34.961Z (about 2 years ago)
- Topics: asynchronous-applications, banyan-protocol-message, python3
- Language: Python
- Homepage: https://mryslab.github.io/python_banyan/#
- Size: 65.9 MB
- Stars: 71
- Watchers: 7
- Forks: 17
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# The Python Banyan Framework

The Python Banyan Framework is a lightweight, reactive framework used to
create flexible, non-blocking, event driven, asynchronous applications.
Python Banyan comes with [full documentation](https://mryslab.github.io/python_banyan/#)
that includes a [User's Guide](https://mryslab.github.io/python_banyan/#users_guide/)
with hands-on examples, as well documentation for the
[OneGPIO Project](https://mryslab.github.io/python_banyan/#gpio_intro/)
that allows you to quickly and easily build reusable GPIO projects for the
Arduino, ESP-8266, and Raspberry Pi.
Base class API's may be viewed [here.](https://htmlpreview.github.io/?https://github.com/MrYsLab/python_banyan/blob/master/html/python_banyan/index.html)
It is being used by [Palace Games](https://www.raspberrypi.org/blog/raspberry-pi-escape-room/)
to concurrently monitor hundreds of real-time sensors and actuators.
* Based on a network connected Publish/Subscribe model, Banyan components publish
user defined protocol messages in the form of Python dictionaries.
* A Banyan protocol message may contain Numpy data.
* Applications may reside on a single computer or be distributed across
multiple computers without having to change source code.
* Compatible Banyan Frameworks are available for [JavaScript](https://github.com/MrYsLab/js-banyan), [Ruby](https://github.com/MrYsLab/rb_banyan), and
[Java](https://github.com/MrYsLab/javabanyan). Components written in any of these languages can interact with components of a differing language without modification.
* Runs on Python 2 or Python 3 (recommended).
To install, view the full [installation instructions.](https://mryslab.github.io/python_banyan/install/#installing-python-banyan_1)
A Simple Banyan Echo Server:
```
import sys
from python_banyan.banyan_base import BanyanBase
class EchoServer(BanyanBase):
"""
This class is a simple Banyan echo server
"""
def __init__(self, ):
# initialize the parent
super(EchoServer, self).__init__(process_name='EchoServer')
# subscribe to receive 'echo' messages from the client
self.set_subscriber_topic('echo')
# wait for messages to arrive
try:
self.receive_loop()
except KeyboardInterrupt:
self.clean_up()
sys.exit(0)
def incoming_message_processing(self, topic, payload):
"""
Process incoming messages from the client
:param topic: message topic
:param payload: message payload
"""
# republish the message with a topic of reply
self.publish_payload(payload, 'reply')
# extract the message number from the payload
print('Message number:', payload['message_number'])
```
A Simple Banyan Echo Client:
```
import sys
from python_banyan.banyan_base import BanyanBase
class EchoClient(BanyanBase):
"""
This is a simple echo client derived from the BanyanBase class.
It sends out a series of messages and expects an
echo reply from the server.
"""
def __init__(self):
# initialize the parent
super(EchoClient, self).__init__(process_name='EchoClient')
# accept banyan messages with the topic of reply
self.set_subscriber_topic('reply')
# sequence number of messages and total number of messages to send
self.message_number = self.number_of_messages = 10
# send the first message - make sure that the server is already started
self.publish_payload({'message_number': self.message_number}, 'echo')
# get the reply messages
try:
self.receive_loop()
except KeyboardInterrupt:
self.clean_up()
sys.exit(0)
def incoming_message_processing(self, topic, payload):
"""
Process incoming messages received from the echo client
:param topic: Message Topic string
:param payload: Message Data
"""
# When a message is received and its number is zero, finish up.
if payload['message_number'] == 0:
print(str(self.number_of_messages) + ' messages sent and received. ')
input('Press enter to exit.')
self.clean_up()
sys.exit(0)
# bump the message number and send the message out
else:
self.message_number -= 1
if self.message_number >= 0:
self.publish_payload({'message_number': self.message_number}, 'echo')
```
This project was developed with [Pycharm](https://www.jetbrains.com/pycharm/) 