Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Python Multiprocessing not running simultaneously

Let’s say I have this simple function:

def print_name(name):
    print(name)
    time.sleep(10)
    print('finished sleeping @ ', str(dt.datetime.now()))

I’m trying to use multiprocessing to run this in a loop for several names all at once, like in the below:

from multiprocessing.pool import ThreadPool as Pool

names = ['A','B','C','D','E']
with Pool() as pool:
    for name in names:
        pool.map(print_name,[name])

However, it doesn’t run simultaneously, it runs one after the other as you can see:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

A
finished sleeping @  2022-07-26 11:03:12.394843
B
finished sleeping @  2022-07-26 11:03:22.400343
.......

NB: I’m having to use ThreadPool instead of Pool as Pool just throws up a random pickling error: _pickle.PicklingError: Can't pickle <function print_name at 0x144ce5000>: attribute lookup print_name on __main__ failed

I have also seen people talking about pathos.multiprocessing but that throws up this error NotImplementedError: pool objects cannot be passed between processes or pickled.

ThreadPool is the only way I can get any form of multiprocessing to at least not throw in an error message. So possibly that’s my problem?

Ultimately I’m hoping to be able to use multiprocessing as I have a big function that takes about 15 mins to run, and I need to run it over a list of about 100 items so multiprocessing would be really handy. But I can’t even get this simple example to work at the minute and I’m a bit stuck, so any help would be really appreciated.

>Solution :

You may want to consider using ProcessPoolExecutor from concurrent.futures but in the meantime, this may help:

import datetime as dt
import time
from multiprocessing import Pool

def print_name(name):
    print(name)
    time.sleep(5)
    print('finished sleeping @ ', dt.datetime.now())

names = ['A','B','C','D','E']

def main():
    with Pool() as pool:
        pool.map(print_name, names)

if __name__ == '__main__':
    main()

Output:

A
B
C
D
E
finished sleeping @  2022-07-26 11:29:31.277722
finished sleeping @  2022-07-26 11:29:31.277749
finished sleeping @  2022-07-26 11:29:31.285708
finished sleeping @  2022-07-26 11:29:31.292636
finished sleeping @  2022-07-26 11:29:31.295505
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading