A simple interface to threading and multiprocessing
Project description
Mantichora
A simple interface to multiprocessing
Mantichora provides a simple interface to multiprocessing.
from mantichora import mantichora
with mantichora() as mcore:
mcore.run(func1)
mcore.run(func2)
mcore.run(func3)
mcore.run(func4)
results = mcore.returns()
100.00% :::::::::::::::::::::::::::::::::::::::: | 12559 / 12559 |: func1
71.27% :::::::::::::::::::::::::::: | 28094 / 39421 |: func2
30.34% :::::::::::: | 28084 / 92558 |: func3
35.26% :::::::::::::: | 27282 / 77375 |: func4
You can simply give Mantichora as many functions as you need to run. Mantichora will run them concurrently in background processes by using multiprocessing and give you the return values of the functions. The return values are sorted in the order of the functions you have originally given to Mantichora. Progress bars from atpbar can be used in the functions.
The code in this package was originally developed in the sub-package concurrently of alphatwirl.
The examples in this file can be also run on Jupyter Notebook.
Requirement
- Python 2.7, 3.6, or 3.7
- atpbar >= 0.9.7
Install
You can install Mantichora with pip
.
$ pip install -U mantichora
Quick start
I will show here how to use Mantichora by simple examples.
Import libraries
We are going use two python standard libraries
time and
random in an example
task function. In the example task function, we are also going to use
atpbar for progress bars.
Import these packages and mantichora
.
import time, random
from atpbar import atpbar
from mantichora import mantichora
Define a task function
Let us define a simple task function.
def task_loop(name, ret=None):
n = random.randint(1000, 100000)
for i in atpbar(range(n), name=name):
time.sleep(0.0001)
return ret
The task in this function is to sleep for 0.0001
seconds as many
times as the number randomly selected from between 10000
and
100000
. atpbar
is used to show a progress bar. The function takes
two arguments: name
, the label on the progress bar, and ret
, the
return value of the function.
Note: Mantichora uses multiprocessing to run task functions in background processes . As a result, task functions, their arguments, and their return values need to be picklable.
You can just try running this functions without using Mantichora.
result = task_loop('task1', 'result1')
This doesn't return immediately. It waits for the function to finish. You will see a progress bar.
100.00% :::::::::::::::::::::::::::::::::::::::: | 58117 / 58117 |: task1
The return value is stored in result
.
print(result)
'result1'
Run tasks concurrently with Mantichora
Now, we run multiple tasks concurrently with Mantichora.
with mantichora(nworkers=3) as mcore:
mcore.run(task_loop, 'task', ret='result1')
mcore.run(task_loop, 'another task', ret='result2')
mcore.run(task_loop, 'still another task', ret='result3')
mcore.run(task_loop, 'yet another task', ret='result4')
mcore.run(task_loop, 'task again', ret='result5')
mcore.run(task_loop, 'more task', ret='result6')
results = mcore.returns()
In the example code above, mantichora
is initialized with an
optional argument nworkers
. The nworkers
specifies the number of
the workers. It is 3
in the above example. The default is 4
. At
most as many tasks as nworkers
can run concurrently.
The with
statement
is used in the example. This ensures that mantichora
properly
ends the workers.
You can give task functions and their arguments to mcore.run()
. You
can call mcore.run()
as many times as you need. In the above
example, mcore.run()
is called with the same task function with
different arguments. You can also use a different function each time.
mcore.run()
returns immediately; it doesn't wait for the task to
finish or event to start. In each call, mcore.run()
only puts a task
in a queue. The workers in background processes pick up tasks from the
queue and run them.
The mcore.returns()
waits until all tasks finish and returns their
return values, which are sorted in the order of the tasks you have
originally give to mcore.run()
.
Progress bars will be shown by atpbar
.
100.00% :::::::::::::::::::::::::::::::::::::::: | 1415 / 1415 |: still another task
100.00% :::::::::::::::::::::::::::::::::::::::: | 7770 / 7770 |: task again
100.00% :::::::::::::::::::::::::::::::::::::::: | 18431 / 18431 |: yet another task
100.00% :::::::::::::::::::::::::::::::::::::::: | 25641 / 25641 |: more task
100.00% :::::::::::::::::::::::::::::::::::::::: | 74669 / 74669 |: task
100.00% :::::::::::::::::::::::::::::::::::::::: | 87688 / 87688 |: another task
The results are sorted in the original order regardless of the order in which the tasks have finished.
print(results)
['result1', 'result2', 'result3', 'result4', 'result5', 'result6']
License
- mantichora is licensed under the BSD license.
Contact
- Tai Sakuma - tai.sakuma@gmail.com
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file mantichora-0.9.1.tar.gz
.
File metadata
- Download URL: mantichora-0.9.1.tar.gz
- Upload date:
- Size: 23.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3be993a9f4969a5852ea73ddcfc31c071e10ce3fdc44c8620ab7ac8e9f0d02c4 |
|
MD5 | b1c5dd1d083dd5340fe2b1459f175832 |
|
BLAKE2b-256 | deeeeb43e34716ba7cd3854ea1f309133c6f0bdf36b6899a753cb73d3fb890bd |
File details
Details for the file mantichora-0.9.1-py2.py3-none-any.whl
.
File metadata
- Download URL: mantichora-0.9.1-py2.py3-none-any.whl
- Upload date:
- Size: 9.3 kB
- Tags: Python 2, Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.21.0 setuptools/40.8.0 requests-toolbelt/0.9.1 tqdm/4.31.1 CPython/3.6.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a5708099af0fb9c4f69f69b762894b34293eb789bdc1203225e4301d6800f0f5 |
|
MD5 | 6626903fcc64e4ec3c34c9f8c496ce34 |
|
BLAKE2b-256 | 7ec58b5e4dcb6ead3f520b8f087f91cfe2e82535f338c6183be564a2c42d23c1 |