使用多重处理时,加入流程是否有顺序规则?

时间:2019-12-09 16:08:01

标签: python multiprocessing subprocess

我有三个Python脚本文件(script1.py,script2.py和script3.py),并且我希望script1.py和script2.py同时运行,并希望script3.py仅在script2.py完成时才启动(script1启动script3时,还不需要完成.py。

我有这样的代码可以解决这个问题,但是我不确定自己做的事情是否正确:

import subprocess
import multiprocessing

def func1(command):
    subprocess.run(command, shell=True)

def func2(command):
    subprocess.run(command, shell=True)

def func3(command):
    subprocess.run(command, shell=True)

if __name__ =='__main__':
    p1 = multiprocessing.Process(target=func1,args=('python3 script1.py',))
    p2 = multiprocessing.Process(target=func2,args=('python3 script2.py',))
    p3 = multiprocessing.Process(target=func3,args=('python3 script3.py',))

    p1.start()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    p1.join()

会起作用吗?有一个更好的方法吗? 是否有规则规定我必须按启动顺序加入他们?

谢谢, 巴纳

2 个答案:

答案 0 :(得分:1)

是的,它将起作用,并且没有顺序规则。

另外,您可以对所有三个进程使用相同的函数,因为它们是相同的,并且可能需要将命令转换为列表(args=(['python3', 'script1.py'],)

答案 1 :(得分:1)

是的,代码将按您希望的方式运行。 p2.join会阻塞直到该过程完全完成。

IMO,在这种情况下,多线程比多处理更有意义。您的子流程实际上并没有做任何工作。他们只是生成另一个进程并休眠直到它返回。

请改用此方法

import threading
import subprocess

def run_script(script_filename):
    command = f'python3 {script_filename}'
    subprocess.run(command, shell=True)

if __name__ =='__main__':
    p1 = threading.Thread(target=run_script, args=['script1.py'])
    p2 = threading.Thread(target=run_script, args=['script2.py'])
    p3 = threading.Thread(target=run_script, args=['script3.py'])

    p1.start()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    p1.join()