Metadata-Version: 2.1
Name: concurrently
Version: 1.1
Summary: Library helps easy write concurrent executed code blocks
Home-page: https://github.com/sirkonst/concurrently
Author: Konstantin Enchant
Author-email: sirkonst@gmail.com
Maintainer: Konstantin Enchant
Maintainer-email: sirkonst@gmail.com
License: UNKNOWN
Keywords: concurrent,thread,threading,process,multiprocessing,asyncio,gevent
Platform: UNKNOWN
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: MIT License
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Natural Language :: Russian
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.5
Provides-Extra: develop
Requires-Dist: wheel ; extra == 'develop'
Requires-Dist: twine ; extra == 'develop'
Requires-Dist: tox ; extra == 'develop'
Requires-Dist: pytest ; extra == 'develop'
Requires-Dist: pytest-asyncio ; extra == 'develop'
Requires-Dist: coverage ; extra == 'develop'
Requires-Dist: Sphinx ; extra == 'develop'
Provides-Extra: gevent
Requires-Dist: gevent ; (python_version < "3.8") and extra == 'gevent'
Requires-Dist: gevent (>=1.5a2) ; (python_version >= "3.8") and extra == 'gevent'

Concurrently
============

Library helps to easily write concurrent executed code blocks.

Quick example:

.. code-block:: python

    import asyncio
    from concurrently import concurrently


    async def amain(loop):
        """
        How to fetch some web pages with concurrently.
        """
        urls = [  # define pages urls
            'http://test/page_1',
            'http://test/page_2',
            'http://test/page_3',
            'http://test/page_4',
        ]
        results = {}

        # immediately run wrapped function concurrent
        # in 2 thread (asyncio coroutines)
        @concurrently(2)
        async def fetch_urls():
            for url in urls:
                # some function for download page
                page = await fetch_page(url)
                results[url] = page

        # wait until all concurrent threads finished
        await fetch_urls()
        print(results)


    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.run_until_complete(amain(loop))


Decorator `@concurrently` makes to main thinks:
    * starts concurrent execution specified count of decorated function
    * returns special `waiter` object to control the running functions

By default, the code runs as asyncio coroutines, but there are other supported
ways to execute, by specifying the argument `engine`.


Documentation
-------------

See https://concurrently.readthedocs.io/


Requirements
============

Now support only **Python 3.5** and above.


Install
=======

From PyPi:

.. code-block:: bash

    $ pip install concurrently


From local:

.. code-block:: bash

    # update setuptools
    $ pip install 'setuptools >= 30.4'
    # do install
    $ make install
    # or
    $ pip install .


Development
===========

Prepare and activate virtual environment like:

.. code-block:: bash

    $ python3 -m venv .env
    # for bash
    $ source .env/bin/activate
    # for fish
    $ . .env/bin/activate.fish

Update pre-install dependencies:

.. code-block:: bash

    $ pip install 'setuptools >= 30.4'

Install:

.. code-block:: bash

    $ make install_dev
    # or
    $ pip install --editable .[develop]

Run tests:

.. code-block:: bash

    $ make test
    # or
    $ pytest tests/


