Ritik Kumar
Ritik Kumar

Reputation: 701

Why do these two processes behave like this?

I'm creating two instances of a process over here but when I'm running this program I'm getting only main function output.

import multiprocessing
import time

def sleepy_man():
    print("Starting to Sleep")
    time.sleep(1)
    print("Done Sleeping")

tic = time.time()
p1 = multiprocessing.Process(target=sleepy_man)
p2 = multiprocessing.Process(target=sleepy_man)
p1.start()
p2.start()

toc = time.time()

print("Done in {:.4f} seconds".format(toc-tic))

Output

Done in 0.0554 seconds

I was doing it for practice from this blog only. Source: https://www.analyticsvidhya.com/blog/2021/04/a-beginners-guide-to-multi-processing-in-python/

Upvotes: 0

Views: 58

Answers (2)

Artiom  Kozyrev
Artiom Kozyrev

Reputation: 3826

import multiprocessing as mp
import time


def sleepy_man():
    print("Starting to Sleep")
    time.sleep(1)
    print("Done Sleeping")


# if you are on Windows, which use spawning to create child processes, use __name__ == '__main__'
if __name__ == '__main__':
    tic = time.time()
    processes = [
        mp.Process(target=sleepy_man),
        mp.Process(target=sleepy_man)
    ]
    [p.start() for p in processes]
    # if you want to see results of process work, join them
    # otherwise if main process finish its work before their children
    # you'll get no results since parent process will finish children 
    # you can also declare Process as daemon=False - as another choice
    # in that case you can use no join()
    # on the other hand join() makes parent process to wait for children join()
    # and only then it prints time in your case
    [p.join() for p in processes]
    toc = time.time()
    print("Done in {:.4f} seconds".format(toc-tic))

Upvotes: 1

Cireo
Cireo

Reputation: 4427

It is worth noting you would see the same behavior if you had somehow set p1.daemon = p2.daemon = True.

It is also possibly due to output buffering, rather than logic errors. Two questions:

  • If you add a sys.stdout.flush() or flush=True to your print, do you see different behavior?
  • If you run this with time python foobar.py does it take .02s or 1s to run?

Obviously, continuing your tutorial and correctly adding .join() below will resolve the issue in a way that would be expected for normal usage.

Upvotes: 1

Related Questions