{ "info": { "author": "Metabolize", "author_email": "github@paulmelnikow.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Topic :: Scientific/Engineering", "Topic :: System :: Distributed Computing" ], "description": "# werkit\n\n[![version](https://img.shields.io/pypi/v/werkit.svg?style=flat-square)][pypi]\n[![python versions](https://img.shields.io/pypi/pyversions/werkit.svg?style=flat-square)][pypi]\n[![license](https://img.shields.io/pypi/l/werkit.svg?style=flat-square)][pypi]\n[![build](https://img.shields.io/circleci/project/github/metabolize/werkit/master.svg?style=flat-square)][build]\n[![code style](https://img.shields.io/badge/code%20style-black-black.svg?style=flat-square)][black]\n\nToolkit for encapsulating Python-based computation into deployable and\ndistributable tasks.\n\nProvides code that helps package things up:\n\n- Serializing results\n- Handling and serializing errors\n- Deploying task workers using [Redis][], [RQ][] and the [Fargate CLI][]\n\n[redis]: https://redis.io/\n[rq]: https://python-rq.org/\n[fargate cli]: https://somanymachines.com/fargate/\n\nThey're particularly useful for providing repsonse consistency across different\nrevisions of a service or different services.\n\n[pypi]: https://pypi.org/project/werkit/\n[coverage]: https://coveralls.io/github/metabolize/werkit\n[build]: https://circleci.com/gh/lace/werkit/tree/master\n[docs build]: https://werkit.readthedocs.io/en/latest/\n[black]: https://black.readthedocs.io/en/stable/\n\n## Installation\n\n```sh\npip install werkit\n```\n\n## Usage\n\n```py\nfrom werkit import Manager\n\ndef myfunc(param, verbose=False, handle_exceptions=True):\n with Manager(handle_exceptions=handle_exceptions, verbose=verbose) as manager:\n manager.result = do_some_computation()\n return manager.serialized_result\n```\n\n## Parallel computation\n\nWerkit supports parallel computation using Redis and RQ.\n\nYou must install the dependencies separately:\n\n```sh\npip install redis rq\n```\n\n### Requesting work\n\n```py\nfrom mylib import myfunc\nfrom werkit.parallel import invoke_for_each\n\n\nitems = {'a': ..., 'b': ...}\njob_ids = invoke_for_each(myfunc, items, connection=Redis.from_url(...))\n```\n\n### Performing work\n\n```sh\npip install redis rq\nrq worker --burst werkit-default --url rediss://...\n```\n\nNote: `mylib.myfunc` must be importable.\n\n### Using CloudManager\n\nIn place of the low-level API you can make your calls using CloudManager:\n\n```py\n#!/usr/bin/env python\n\n\nimport click\nfrom werkit.parallel import Config, CloudManager, invoke_for_each\n\nmanager = CloudManager(\n config=Config(\n local_repository=\"my-project\",\n ecr_repository=\"123456789012.dkr.ecr.us-east-1.amazonaws.com/my-project\",\n ecs_task_name=\"my-project\",\n task_args=[\n \"--cpu\",\n \"1024\",\n \"--memory\",\n \"2048\",\n \"--task-role\",\n \"arn:aws:iam::123456789012:role/...\",\n \"--security-group-id\",\n \"sg-...\",\n \"--subnet-id\",\n \"subnet-...\",\n ],\n default_task_count=5,\n )\n)\n\n\n@click.group()\ndef cli():\n pass\n\n\n@cli.command()\ndef login():\n manager.login()\n\n\n@cli.command()\n@click.argument(\"tag\")\ndef build_and_push(tag):\n manager.build_and_push()\n\n\n@cli.command()\ndef enqueue():\n from myproject import myfunc\n\n items = {\"key1\": \"value1\", \"key2\": \"value2\"}\n\n invoke_for_each(\n measure_body,\n items,\n clean=True,\n connection=manager.redis_connection,\n )\n\n\n@cli.command()\n@click.option(\n \"--count\",\n default=manager.config.default_task_count,\n type=int,\n help=\"Number of tasks to run\",\n)\n@click.argument(\"tag\")\ndef run(count, tag):\n manager.run(tag=tag, count=count)\n\n\n@cli.command()\ndef dashboard():\n manager.dashboard()\n\n\n@cli.command()\ndef ps():\n manager.ps()\n\n\n@cli.command()\ndef get_results():\n print(manager.get_results())\n\n\n@cli.command()\ndef clean():\n manager.clean()\n\n\nif __name__ == \"__main__\":\n cli()\n```\n\n### Getting results\n\n```py\nfrom redis import Redis\nfrom werkit.parallel import get_results\n\n\nget_results(wait_until_done=True, connection=Redis.from_url(...))\n```\n\n### Monitoring\n\nYou can monitor your queues using [RQ Dashboard][] or one of the\n[other methods outlined here][monitoring].\n\n[rq dashboard]: https://github.com/eoranged/rq-dashboard\n[monitoring]: https://python-rq.org/docs/monitoring/\n\n\n## Contribute\n\n- Issue Tracker: https://github.com/metabolize/werkit/issues\n- Source Code: https://github.com/metabolize/werkit\n\nPull requests welcome!\n\n\n## Support\n\nIf you are having issues, please let us know.\n\n\n## License\n\nThe project is licensed under the MIT License.", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/metabolize/werkit", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "werkit", "package_url": "https://pypi.org/project/werkit/", "platform": "", "project_url": "https://pypi.org/project/werkit/", "project_urls": { "Documentation": "https://werkit.readthedocs.io/en/stable/", "Homepage": "https://github.com/metabolize/werkit", "Issue Tracker": "https://github.com/metabolize/werkit/issues" }, "release_url": "https://pypi.org/project/werkit/0.3.3/", "requires_dist": null, "requires_python": "", "summary": "Toolkit for encapsulating Python-based computation into deployable and distributable tasks", "version": "0.3.3" }, "last_serial": 5698239, "releases": { "0.1.0": [ { "comment_text": "", "digests": { "md5": "a63e5d20930dab52efe6c6969b4066bf", "sha256": "dd9e1aa6662e8f67dc0171f702a402538c7ecd907fb71de1322bff566e90fd3c" }, "downloads": -1, "filename": "werkit-0.1.0.tar.gz", "has_sig": false, "md5_digest": "a63e5d20930dab52efe6c6969b4066bf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3594, "upload_time": "2019-07-22T18:32:27", "url": "https://files.pythonhosted.org/packages/92/f2/63d3704376febbfe5ced9aad197de50aa65acd7324081d3be0553039e0c5/werkit-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "a5df4dab3dbc9f2bf2d2c4079d068833", "sha256": "e641f370ea8650c0608a25c27aa3d84c2975c55f64e4f17dc29bf1fae672df3f" }, "downloads": -1, "filename": "werkit-0.2.0.tar.gz", "has_sig": false, "md5_digest": "a5df4dab3dbc9f2bf2d2c4079d068833", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3597, "upload_time": "2019-07-22T19:03:13", "url": "https://files.pythonhosted.org/packages/06/98/da894bcea6e60def7e34414b67f959efd94041497f2038fc6bfa928c1bc9/werkit-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "996ea13bbdfdf6a2ed639e94cdff3eb1", "sha256": "a2c87505c588415a4767182c5b54d18555825d7f064119cf5721360e4f6b54aa" }, "downloads": -1, "filename": "werkit-0.3.0.tar.gz", "has_sig": false, "md5_digest": "996ea13bbdfdf6a2ed639e94cdff3eb1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7676, "upload_time": "2019-08-12T07:32:32", "url": "https://files.pythonhosted.org/packages/36/14/7c6dc3cb8cf8faa3c2f8a029c4811620ee3855a6ada1e2c05a27e5e1a8c6/werkit-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "50e83c0ff2c09d5b6bcda8bfeceb24cc", "sha256": "762d8b15361f9055d71af398c42ffa68a77115a745aa4489deccb809dacee844" }, "downloads": -1, "filename": "werkit-0.3.1.tar.gz", "has_sig": false, "md5_digest": "50e83c0ff2c09d5b6bcda8bfeceb24cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7165, "upload_time": "2019-08-12T07:35:48", "url": "https://files.pythonhosted.org/packages/87/ab/fef45c55d36839b254fbf87eb7099d4760ab206cb09690176e6ddcb567f1/werkit-0.3.1.tar.gz" } ], "0.3.2": [ { "comment_text": "", "digests": { "md5": "352a08600dc22c0d348fafe733c24267", "sha256": "de561a1f9e3fdb7e048c6947fe146631feda3cc9798ffeb804723de934cd59d2" }, "downloads": -1, "filename": "werkit-0.3.2.tar.gz", "has_sig": false, "md5_digest": "352a08600dc22c0d348fafe733c24267", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7185, "upload_time": "2019-08-17T14:32:05", "url": "https://files.pythonhosted.org/packages/ac/1e/dafe82eded9c00f7c036d9fba9bce56e9d958064b036c095b5955e2a9c8c/werkit-0.3.2.tar.gz" } ], "0.3.3": [ { "comment_text": "", "digests": { "md5": "0893863b31893c01baa5ac085761f75a", "sha256": "9fc0cf1c8ae74beddf0c6119aac790ef495937f4dc3a1d31fb180e64574ead30" }, "downloads": -1, "filename": "werkit-0.3.3.tar.gz", "has_sig": false, "md5_digest": "0893863b31893c01baa5ac085761f75a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7227, "upload_time": "2019-08-19T13:07:30", "url": "https://files.pythonhosted.org/packages/63/25/ad93c98b129018e14461c918832311e82c6ab90f5f2d06002722d8a8fdaf/werkit-0.3.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "0893863b31893c01baa5ac085761f75a", "sha256": "9fc0cf1c8ae74beddf0c6119aac790ef495937f4dc3a1d31fb180e64574ead30" }, "downloads": -1, "filename": "werkit-0.3.3.tar.gz", "has_sig": false, "md5_digest": "0893863b31893c01baa5ac085761f75a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7227, "upload_time": "2019-08-19T13:07:30", "url": "https://files.pythonhosted.org/packages/63/25/ad93c98b129018e14461c918832311e82c6ab90f5f2d06002722d8a8fdaf/werkit-0.3.3.tar.gz" } ] }