{ "info": { "author": "Aric Coady", "author_email": "aric.coady@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Framework :: AsyncIO", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "[![image](https://img.shields.io/pypi/v/futured.svg)](https://pypi.org/project/futured/)\n![image](https://img.shields.io/pypi/pyversions/futured.svg)\n[![image](https://pepy.tech/badge/futured)](https://pepy.tech/project/futured)\n![image](https://img.shields.io/pypi/status/futured.svg)\n[![image](https://img.shields.io/travis/coady/futured.svg)](https://travis-ci.org/coady/futured)\n[![image](https://img.shields.io/codecov/c/github/coady/futured.svg)](https://codecov.io/github/coady/futured)\n[![image](https://readthedocs.org/projects/futured/badge)](https://futured.readthedocs.io)\n[![image](https://requires.io/github/coady/futured/requirements.svg)](https://requires.io/github/coady/futured/requirements/)\n[![image](https://api.codeclimate.com/v1/badges/bdc33b8af847fbbecfce/maintainability)](https://codeclimate.com/github/coady/futured/maintainability)\n[![image](https://img.shields.io/badge/code%20style-black-000000.svg)](https://pypi.org/project/black/)\n\nFutured provides a simple consistent interface for concurrent functional programming in Python.\nIt wraps any callable to return a `concurrent.futures.Future`,\nwraps any async coroutine to return an `asyncio.Future`,\nand provides concurrent iterators and context managers for futures.\n\n# Usage\n## threaded, processed\nTransform any callable into one which runs in a thread or process pool, and returns a future.\n\n```python\nfrom futured import threaded, processed\nimport requests\n\nfetch = threaded(requests.Session().get)\nfetch(url) # return Future\n\nfs = (fetch(url + path) for path in paths)\nthreaded.results(fs) # generate results from futures\nthreaded.results(fs, timeout=...) # generate results as completed\n\nfetch.map(urls) # generate results in order\nfetch.map(urls, timeout=...) # generate results as completed\nfetch.mapzip(urls) # generate (url, result) pairs as completed\n```\n\nThread and process pool executors may be used as context managers,\ncustomized with options, and reused with different callables.\n\n```python\nthreaded(max_workers=...)(func, ...)\nprocessed(max_workers=...)(func, ...)\n```\n\n`futured` classes have a `waiting` context manager which collects results from tasks.\nFutures can be registered at creation, or appended to the list of tasks.\n\n```python\nwith threaded.waiting(*fs) as tasks:\n tasks.append(future)\ntasks # list of completed results\n```\n\n## asynced\nThe same interface works for `asyncio`.\n\n```python\nfrom futured import asynced\nimport aiohttp\n\nfetch = asynced(aiohttp.ClientSession().get)\nfetch(url) # return coroutine\n\nasynced.results(fs) # generate results from futures\nasynced.results(fs, timeout=...) # generate results as completed\n\nfetch.map(urls) # generate results in order\nfetch.map(urls, timeout=...) # generate results as completed\nfetch.mapzip(urls) # generate (url, result) pairs as completed\n```\n\n`asynced` provides utilities for calling coroutines from a synchronous context.\n`waiting` is similar to [trio's nursery](https://trio.readthedocs.io/en/latest/reference-core.html#nurseries-and-spawning),\nbut returns results from a synchronous `with` block.\n\n```python\nasynced.run(async_func, ...) # call and run until complete\nasynced.run(async_gen, ...) # call and run synchronous iterator\nwith asynced.waiting(*fs) as tasks: # concurrent coroutines completed in a block\n```\n\n## decorators\nNaturally `futured` wrappers can be used as decorators, but arguments can also be partially bound.\n\n```python\n@threaded\ndef slow():\n ...\n\nfetch = threaded(requests.Session().get, url)\nfetch(params=...)\n```\n\nMethods are supported, as well as a `decorated` utility for automatically subclassing.\n\n```python\nfrom futured import decorated\n\nFutureSession = decorated(requests.Session, request=threaded)\n\n # equivalent to\nclass FutureSession(requests.Session):\n request = threaded(requests.Session.request)\n```\n\n## command\n`command` wraps `subprocess.Popen` to provide a `Future` compatible interface.\n\n```python\nfrom futured import futured, command\n\ncommand('ls').result() # return stdout or raises stderr\ncommand('ls').pipe('wc') # pipes into next command, or | ('wc',... )\nfor line in command('ls'): # iterable lines\ncommand.coroutine('ls') # return coroutine\n\nfutured(command, 'ls') # supports `map` interface\nasynced(command.coroutine, 'ls') # supports `map` interface with timeout\n```\n\n## forked\n`forked` allows iteration in separate child processes.\n\n```python\nfrom futured import forked\n\nfor value in forked(values, max_workers=...):\n # in a child process\n # in parent after children have exited\n```\n\n# Installation\n\n $ pip install futured\n\n# Tests\n100% branch coverage.\n\n $ pytest [--cov]\n\n# Changes\n1.0\n* Executed functions are context managers\n* `starmap` supported\n\n0.3\n* `forked` has optional maximum number of workers\n* `waiting` context manager\n* `command` pipes (`|`)\n* `distributed.Client` support\n\n0.2\n* `command.coroutine` creates asyncio subprocesses\n* `futured.mapzip` generates results zipped with arguments\n* `asynced.run` supports asynchronous iterators\n\n\n", "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/coady/futured", "keywords": "concurrent futures threads processes async asyncio", "license": "Apache Software License", "maintainer": "", "maintainer_email": "", "name": "futured", "package_url": "https://pypi.org/project/futured/", "platform": "", "project_url": "https://pypi.org/project/futured/", "project_urls": { "Documentation": "https://futured.readthedocs.io", "Homepage": "https://github.com/coady/futured" }, "release_url": "https://pypi.org/project/futured/1.0/", "requires_dist": [ "m2r ; extra == 'docs'", "nbsphinx ; extra == 'docs'", "jupyter ; extra == 'docs'", "nest-asyncio ; extra == 'docs'", "aiohttp ; extra == 'docs'" ], "requires_python": ">=3.5", "summary": "Functional interface for concurrent futures, including asynchronous I/O.", "version": "1.0" }, "last_serial": 5564164, "releases": { "0.0": [ { "comment_text": "", "digests": { "md5": "d2ee9c898aa9d3d52387206f05f2a7d6", "sha256": "504e4a25dadec954868192737c7984e834e48682762fa18596fbdeba593009cd" }, "downloads": -1, "filename": "futured-0.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d2ee9c898aa9d3d52387206f05f2a7d6", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 4235, "upload_time": "2017-05-07T21:25:22", "url": "https://files.pythonhosted.org/packages/42/3b/15b36140ada7d283fdc01448cdb627075a2846ea6d63f897cd6e08378e4d/futured-0.0-py2.py3-none-any.whl" } ], "0.1": [ { "comment_text": "", "digests": { "md5": "da7db36802a91c8388a2a7e437f7ae82", "sha256": "889e8033defff6f41be9b73bda55a46c9a5128204912764b9579dc0404cac12e" }, "downloads": -1, "filename": "futured-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "da7db36802a91c8388a2a7e437f7ae82", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 5661, "upload_time": "2017-06-11T21:49:32", "url": "https://files.pythonhosted.org/packages/01/52/3e2e4f64881e3b3bda051e47bfadfdd53c0a8587fc22a94684a0474a2eda/futured-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "385aa16a689f0edc30a1f0486a105c42", "sha256": "d8da11cfb3ce48154722bd6c6d42fa67637ccf3b801b801789eb17e161cd43d7" }, "downloads": -1, "filename": "futured-0.1.tar.gz", "has_sig": false, "md5_digest": "385aa16a689f0edc30a1f0486a105c42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4686, "upload_time": "2017-06-11T21:49:34", "url": "https://files.pythonhosted.org/packages/5d/ec/341c9f89f49ae8cfb16bb08953a0df37f82d911414b1187af8abf70f318b/futured-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "136cd69c8141509d45260fe198d4c327", "sha256": "04ace8a3daebca7b657acf3f0a2c93272527f124af53d2d7ac10e605da08b5c2" }, "downloads": -1, "filename": "futured-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "136cd69c8141509d45260fe198d4c327", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 6488, "upload_time": "2017-09-17T23:51:02", "url": "https://files.pythonhosted.org/packages/2e/f2/8fcbb9487667aeadba5c5e247a43d15c933e7eb2d66208af4dc435b26e50/futured-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1405a7efd098ebd4cfed4de0f3ee1366", "sha256": "2f09b4cf832133c386921fdcf22bad26bf2f94cd4ebe6cbb193509b317c701cc" }, "downloads": -1, "filename": "futured-0.2.tar.gz", "has_sig": false, "md5_digest": "1405a7efd098ebd4cfed4de0f3ee1366", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5565, "upload_time": "2017-09-17T23:51:04", "url": "https://files.pythonhosted.org/packages/bf/d4/0a14149d0e007902183bf9e72ba0333154e1f903ede34f70df86082b3d62/futured-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "9d9865fcc005393894ca6ea07c2ae908", "sha256": "b1eeac1e34fa3628e0b33311be9327c174c2552dcac916e4ed787eacb9830d41" }, "downloads": -1, "filename": "futured-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "9d9865fcc005393894ca6ea07c2ae908", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 4935, "upload_time": "2018-08-18T18:59:49", "url": "https://files.pythonhosted.org/packages/92/d9/a55b4cfa0b1d561745b08ccecae8d7685dbbcdcdd1be6d613a3cbffc7644/futured-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d388d3e07ddf609e499cb5870b4fb692", "sha256": "df5e025d8bfa5c94dc0f504a14d4b61e702b8007849626e90edb35d0f3aa5ebd" }, "downloads": -1, "filename": "futured-0.3.tar.gz", "has_sig": false, "md5_digest": "d388d3e07ddf609e499cb5870b4fb692", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 6616, "upload_time": "2018-08-18T18:59:51", "url": "https://files.pythonhosted.org/packages/6d/f1/3b430180ee782c61fc6c5e4bd0b41987196e4ade885043602fe334648ff7/futured-0.3.tar.gz" } ], "1.0": [ { "comment_text": "", "digests": { "md5": "23dd21ffb12f4c154d74e21e6b745466", "sha256": "84681089fc7c697091c25a29f1b6d86060b48b642261c8991d1e111f98649cba" }, "downloads": -1, "filename": "futured-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "23dd21ffb12f4c154d74e21e6b745466", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 5963, "upload_time": "2019-07-21T18:45:55", "url": "https://files.pythonhosted.org/packages/00/0f/fcb08f82fe7b2d3182c464cb8f7d08e49d8cf2fed6defd2ba569697acaf7/futured-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02e539152272edb9f1d5072435701ac8", "sha256": "5a757bca581d5f3ff87229a06d7d2b1c113e297baf184723f544258d3dba615b" }, "downloads": -1, "filename": "futured-1.0.tar.gz", "has_sig": false, "md5_digest": "02e539152272edb9f1d5072435701ac8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10967, "upload_time": "2019-07-21T18:45:56", "url": "https://files.pythonhosted.org/packages/ba/d5/13e81ce61fc305b4019223a3eed339f368f11d3b505f1d9356cbd4a5f521/futured-1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "23dd21ffb12f4c154d74e21e6b745466", "sha256": "84681089fc7c697091c25a29f1b6d86060b48b642261c8991d1e111f98649cba" }, "downloads": -1, "filename": "futured-1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "23dd21ffb12f4c154d74e21e6b745466", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5", "size": 5963, "upload_time": "2019-07-21T18:45:55", "url": "https://files.pythonhosted.org/packages/00/0f/fcb08f82fe7b2d3182c464cb8f7d08e49d8cf2fed6defd2ba569697acaf7/futured-1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02e539152272edb9f1d5072435701ac8", "sha256": "5a757bca581d5f3ff87229a06d7d2b1c113e297baf184723f544258d3dba615b" }, "downloads": -1, "filename": "futured-1.0.tar.gz", "has_sig": false, "md5_digest": "02e539152272edb9f1d5072435701ac8", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5", "size": 10967, "upload_time": "2019-07-21T18:45:56", "url": "https://files.pythonhosted.org/packages/ba/d5/13e81ce61fc305b4019223a3eed339f368f11d3b505f1d9356cbd4a5f521/futured-1.0.tar.gz" } ] }