简体   繁体   中英

How to stop multiprocessing in python running for the full script

I have the following code in python:

import multiprocessing
import time

print "I want this to show once at the beggining"

def leaveout():
    print "I dont Want This to Show"

def hang(input1):
        print "I want this to show 3 times"
        print "Number = %s" % input1

def main():
    p = multiprocessing.Process(target=hang, args=("0"))
    p.start()
    p1 = multiprocessing.Process(target=hang, args=("1"))
    p1.start()
    p2 = multiprocessing.Process(target=hang, args=("2"))
    p2.start()
    p.join()
    p1.join()
    p2.join()

if __name__ == '__main__':
    main()

print "I want this to show once at the end"

My objective is to multiprocesses the hang function in three instances which is happening successfully. My issue is that the main function also runs three instances of the entire script resuting in the following output:

c:\Evopt>python multiprocessingprac.py
I want this to show once at the beggining
I want this to show once at the beggining
I want this to show once at the end
I want this to show 3 times
Number = 2
I want this to show once at the beggining
I want this to show once at the end
I want this to show 3 times
Number = 1
I want this to show once at the beggining
I want this to show once at the end
I want this to show 3 times
Number = 0
I want this to show once at the end

How can I stop this happening?

When spawning a new process, Windows creates a blank process. A new Python interpreter is then loaded in the spawned process and it's given the same code base to interpret.

That's why you see duplicated print statements being executed. As they are top level expressions, they will be executed every time a process will evaluate that code.

In Unix OSes this is not observed because it implements a totally different process creation mechanism (the fork strategy) which does not require a new Python interpreter to be loaded again in the child process.

To fix your issue, you need to remove the print( ... ) expressions from the script and move them into the main function.

def main():
    print("I want this to show once at the beggining")

    p0 = multiprocessing.Process( ... )
    p0.start() 

    ...

    p2.join()

    print("I want this to show once at the end")

You can read more about process start strategies in the multiprocessing documentation .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM