In case anyone is looking for a very easy way to use multiprocessing with *args and **kwargs, I’ve released a neat wrapper as mplite:
The test is also the showcase:
from mplite import TaskManager, Task
import time
# first create the function that each cpu should work on individually.
def f(*args, **kwargs):
print(args, kwargs)
time.sleep(args[0])
return args[0]
# Next create the main function you'd like to run everything from:
def main():
tasks = [] # create a tasklist and populate it with tasks
for n in list(range(10))*5:
t = Task(f, *(n/10,), **{'hello': n})
tasks.append(t)
with TaskManager() as tm:
results = tm.execute(tasks)
if __name__ == "__main__":
main()
output:
0%| | 0/50 [00:00<?, ?tasks/s](0.0,) {'hello': 0}
(0.1,)(0.2,) {'hello': 2}
{'hello': 1}
(0.3,) {'hello': 3}
2%|██▌ | 1/50 [00:00<00:09, 5.16tasks/s](0.4,) {'hello': 4}
(0.5,) {'hello': 5}
(0.6,) {'hello': 6}
(0.7,) {'hello': 7}
(0.8,) {'hello': 8}
(0.9,) {'hello': 9}
4%|█████▏ | 2/50 [00:00<00:07, 6.83tasks/s](0.0,) {'hello': 0}
(0.1,) {'hello': 1}
6%|███████▊ | 3/50 [00:00<00:06, 7.62tasks/s](0.2,) {'hello': 2}
(0.3,) {'hello': 3}
12%|███████████████▋ | 6/50 [00:00<00:03, 14.55tasks/s](0.4,) {'hello': 4}
(0.5,) {'hello': 5}
(0.6,) {'hello': 6}
16%|████████████████████▉ | 8/50 [00:00<00:03, 12.73tasks/s](0.7,) {'hello': 7}
20%|██████████████████████████ | 10/50 [00:00<00:02, 14.26tasks/s]{'hello': 8}
(0.9,) {'hello': 9}
24%|███████████████████████████████▏ | 12/50 [00:00<00:02, 15.24tasks/s](0.0,) {'hello': 0}
(0.1,) {'hello': 1}
(0.2,) {'hello': 2}
30%|███████████████████████████████████████ | 15/50 [00:01<00:01, 18.00tasks/s](0.3,) {'hello': 3}
(0.4,) {'hello': 4}
34%|████████████████████████████████████████████▏ | 17/50 [00:01<00:02, 16.15tasks/s]
{'hello': 5}
(0.6,) {'hello': 6}
(0.7,) {'hello': 7}
40%|████████████████████████████████████████████████████ | 20/50 [00:01<00:01, 19.12tasks/s](0.8,) {'hello': 8}
(0.9,) {'hello': 9}
(0.0,) {'hello': 0}
(0.1,) {'hello': 1}
46%|███████████████████████████████████████████████████████████▊ | 23/50 [00:01<00:01, 14.43tasks/s]{'hello': 2}
(0.3,) {'hello': 3}
(0.4,) {'hello': 4}
(0.5,) {'hello': 5}
56%|████████████████████████████████████████████████████████████████████████▊ | 28/50 [00:01<00:01, 16.96tasks/s]
{'hello': 6}
(0.7,) {'hello': 7}
(0.8,) {'hello': 8}
62%|████████████████████████████████████████████████████████████████████████████████▌ | 31/50 [00:02<00:01, 17.19tasks/s]
(0.0,) {'hello': 0}
(0.1,) {'hello': 1}
66%|█████████████████████████████████████████████████████████████████████████████████████▊ | 33/50 [00:02<00:01, 16.73tasks/s](0.2,) {'hello': 2}
(0.3,) {'hello': 3}
(0.4,) {'hello': 4}
74%|████████████████████████████████████████████████████████████████████████████████████████████████▏ | 37/50 [00:02<00:00, 17.67tasks/s](0.5,) {'hello': 5}
(0.6,) {'hello': 6}
(0.7,) {'hello': 7}
80%|████████████████████████████████████████████████████████████████████████████████████████████████████████ | 40/50 [00:02<00:00, 19.14tasks/s](0.8,) {'hello': 8}
(0.9,) {'hello': 9}
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 50/50 [00:03<00:00, 14.24tasks/s]