Non-blocking Python methods using decorators
.. image:: https://img.shields.io/badge/python-2.7,%203.5+-blue.svg?style=flat :target: https://pypi.python.org/pypi/multitasking :alt: Python version
.. image:: https://img.shields.io/travis/ranaroussi/multitasking/main.svg? :target: https://travis-ci.org/ranaroussi/multitasking :alt: Travis-CI build status
.. image:: https://img.shields.io/pypi/v/multitasking.svg?maxAge=60 :target: https://pypi.python.org/pypi/multitasking :alt: PyPi version
.. image:: https://img.shields.io/pypi/status/multitasking.svg?maxAge=2592000 :target: https://pypi.python.org/pypi/multitasking :alt: PyPi status
.. image:: https://img.shields.io/pypi/dm/multitasking.svg?maxAge=2592000 :target: https://pypi.python.org/pypi/multitasking :alt: PyPi downloads
.. image:: https://www.codefactor.io/repository/github/ranaroussi/multitasking/badge :target: https://www.codefactor.io/repository/github/ranaroussi/multitasking :alt: CodeFactor
.. image:: https://img.shields.io/github/stars/ranaroussi/multitasking.svg?style=social&label=Star&maxAge=60 :target: https://github.com/ranaroussi/multitasking :alt: Star this repo
.. image:: https://img.shields.io/twitter/follow/aroussi.svg?style=social&label=Follow%20Me&maxAge=60 :target: https://twitter.com/aroussi :alt: Follow me on twitter
\
MultiTasking is a tiny Python library lets you convert your Python methods into asynchronous, non-blocking methods simply by using a decorator.
.. code:: python
# example.py
import multitasking
import time
import random
import signal
# kill all tasks on ctrl-c
signal.signal(signal.SIGINT, multitasking.killall)
# or, wait for task to finish on ctrl-c:
# signal.signal(signal.SIGINT, multitasking.wait_for_tasks)
@multitasking.task # <== this is all it takes :-)
def hello(count):
sleep = random.randint(1,10)/2
print("Hello %s (sleeping for %ss)" % (count, sleep))
time.sleep(sleep)
print("Goodbye %s (after for %ss)" % (count, sleep))
if __name__ == "__main__":
for i in range(0, 10):
hello(i+1)
The output would look something like this:
.. code:: bash
$ python example.py
Hello 1 (sleeping for 0.5s)
Hello 2 (sleeping for 1.0s)
Hello 3 (sleeping for 5.0s)
Hello 4 (sleeping for 0.5s)
Hello 5 (sleeping for 2.5s)
Hello 6 (sleeping for 3.0s)
Hello 7 (sleeping for 0.5s)
Hello 8 (sleeping for 4.0s)
Hello 9 (sleeping for 3.0s)
Hello 10 (sleeping for 1.0s)
Goodbye 1 (after for 0.5s)
Goodbye 4 (after for 0.5s)
Goodbye 7 (after for 0.5s)
Goodbye 2 (after for 1.0s)
Goodbye 10 (after for 1.0s)
Goodbye 5 (after for 2.5s)
Goodbye 6 (after for 3.0s)
Goodbye 9 (after for 3.0s)
Goodbye 8 (after for 4.0s)
Goodbye 3 (after for 5.0s)
The default maximum threads is equal to the # of CPU Cores.
This is just a rule of thumb! The Thread
module isn't actually using more than one core at a time.
You can change the default maximum number of threads using:
.. code:: python
import multitasking
multitasking.set_max_threads(10)
...or, if you want to set the maximum number of threads based on the number of CPU Cores, you can:
.. code:: python
import multitasking
multitasking.set_max_threads(multitasking.config["CPU_CORES"] * 5)
For applications that doesn't require access to shared resources,
you can set MultiTasking
to use multiprocessing.Process()
instead of the threading.Thread()
, thus avoiding some of the
GIL constraints <https://jeffknupp.com/blog/2013/06/30/pythons-hardest-problem-revisited/>
_.
.. code:: python
import multitasking
multitasking.set_engine("process") # "process" or "thread"
Install multitasking using pip
:
.. code:: bash
$ pip install multitasking --upgrade --no-cache-dir
Install multitasking using conda
:
.. code:: bash
$ conda install -c ranaroussi multitasking
MultiTasking is distributed under the Apache Software License. See the LICENSE.txt <./LICENSE.txt>
_ file in the release for details.
Please drop me an note with any feedback you have.
Ran Aroussi