{ "info": { "author": "Matthias Urlichs", "author_email": "matthias@urlichs.de", "bugtrack_url": null, "classifiers": [], "description": "asyncactor\n==========\n\nAsyncActor is an async Python module that aids in service discovery and\n\"somewhat-leader\" election in a heterogenous, sometimes-disconnected\nnetwork.\n\nAsyncActor can run on top of any reliable broadcast channel.\nThis version includes back-ends for Serf and MQTT.\n\nAsyncActor sends as few packets as possible, thus is well-suited for\nIoT-related applications with many stations but limited bandwidth.\n\nTheory of operation\n+++++++++++++++++++\n\nAssume that you have a non-lossy network with a bounded latency (let's\nassume one second). Assume further that you'd like to know within ten\nseconds whether your node is still online.\n\nAsyncActor sends one beacon message every seven to nine seconds. The message\nincludes a list of N previous hosts who have transmitted the beacon; the\nhost that's last in this list will be the next transmitter.\n\nThe time slot starting at the seven-second mark is used for random hosts\nwhich would like to enter the beacon sending business. This is somewhat\nlikely if the list of hosts is currently smaller than N. The slot at eight\nseconds is used for the hosts at the end of the list; the last host will\nsend first, but if its beacon is not seen then the next-to-last will send\nits message, and so on.\n\nThe time slot at nine seconds is used for last-resort messages, i.e. any\nparticipating host can and will send its beacon message.\n\nCollisions are resolved at the ten-second mark, i.e. the list of messages\nis ordered deterministically: the winner will announce to its clients that\na new slot has started and whether all N host slots are filled.\n\nIt uses `anyio ` as its underlying\nasync framework.\n\n.. image:: https://badge.fury.io/py/asyncactor.svg\n :alt: PyPI latest version badge\n :target: https://pypi.python.org/pypi/asyncactor\n.. image:: https://coveralls.io/repos/smurfix/asyncactor/badge.png?branch=master\n :alt: Code coverage badge\n :target: https://coveralls.io/r/smurfix/asyncactor?branch=master\n\nInstallation\n------------\n\nAsyncActor requires a back-end, i.e. either a running Serf agent or a MQTT\nbroker.\n\nTo install AsyncActor, run the following command:\n\n.. code-block:: bash\n\n $ pip install asyncactor\n\nor alternatively (you really should be using pip though):\n\n.. code-block:: bash\n\n $ easy_install asyncactor\n\nor from source:\n\n.. code-block:: bash\n\n $ python setup.py install\n\nGetting Started\n---------------\n\nThese examples require a running async loop.\n`Trio ` is recommended, though\n``asyncio`` works too.\n\n.. code-block:: python\n\n from asyncactor import client as actor\n from somewhere import some_transport\n\n async with some_transport.connect('localhost') as t:\n async with actor(t, prefix=('actor','test')) as client:\n async for client.events as m:\n print(m)\n\nDevelopment\n------------\n\nYou can run the tests using the following commands:\n\n.. code-block:: bash\n\n $ serf agent & # start serf agent\n $ mosquitto \n $ python3 -mpytest tests\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/smurfix/asyncactor", "keywords": "Serf", "license": "GPL3", "maintainer": "", "maintainer_email": "", "name": "asyncactor", "package_url": "https://pypi.org/project/asyncactor/", "platform": "", "project_url": "https://pypi.org/project/asyncactor/", "project_urls": { "Homepage": "https://github.com/smurfix/asyncactor" }, "release_url": "https://pypi.org/project/asyncactor/0.17.0/", "requires_dist": null, "requires_python": "", "summary": "Async decentralized actor", "version": "0.17.0" }, "last_serial": 5932263, "releases": { "0.16.2": [ { "comment_text": "", "digests": { "md5": "b9a697504b92caefd8d4a919735471df", "sha256": "868ba8b2a66d36656f4842a2dc7312ede2e3abbd0ae90651fcaedab6dae6e18b" }, "downloads": -1, "filename": "asyncactor-0.16.2.tar.gz", "has_sig": false, "md5_digest": "b9a697504b92caefd8d4a919735471df", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28688, "upload_time": "2019-10-05T13:19:05", "url": "https://files.pythonhosted.org/packages/7c/29/52433cfeb2f90a33ebb5bdbb5859591af15945f411b8f89b6134a0d058c6/asyncactor-0.16.2.tar.gz" } ], "0.17.0": [ { "comment_text": "", "digests": { "md5": "bfa213fddb9ee26c9317e934e3fa15b3", "sha256": "3d707334717fddd0e4b26a6644a57d4a3b906211744ad748828e7381335d5dab" }, "downloads": -1, "filename": "asyncactor-0.17.0.tar.gz", "has_sig": false, "md5_digest": "bfa213fddb9ee26c9317e934e3fa15b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28914, "upload_time": "2019-10-05T15:14:30", "url": "https://files.pythonhosted.org/packages/d5/a0/7d1e6935a8201936a9b558100c244bef5b863630bf511ec2c2330dd16262/asyncactor-0.17.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bfa213fddb9ee26c9317e934e3fa15b3", "sha256": "3d707334717fddd0e4b26a6644a57d4a3b906211744ad748828e7381335d5dab" }, "downloads": -1, "filename": "asyncactor-0.17.0.tar.gz", "has_sig": false, "md5_digest": "bfa213fddb9ee26c9317e934e3fa15b3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28914, "upload_time": "2019-10-05T15:14:30", "url": "https://files.pythonhosted.org/packages/d5/a0/7d1e6935a8201936a9b558100c244bef5b863630bf511ec2c2330dd16262/asyncactor-0.17.0.tar.gz" } ] }