使用多处理时加入进程是不是有顺序规则?

Posted

技术标签:

【中文标题】使用多处理时加入进程是不是有顺序规则?【英文标题】:Is there a rule of order for joining processes when using multiprocessing?使用多处理时加入进程是否有顺序规则? 【发布时间】:2020-04-02 18:38:03 【问题描述】:

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

我有一个这样的代码来解决它,但我不确定我是否在做正确的事情:

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()

它会起作用吗?有一个更好的方法吗? 有没有规定我必须按照他们开始时的顺序加入他们?

【问题讨论】:

我想你想在 p3 行中使用script3.py 是的,谢谢。我会编辑。 【参考方案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()

【讨论】:

【参考方案2】:

是的,它会起作用,而且没有秩序。

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

【讨论】:

所以 script3 在 script2 完成之前不会启动,对吧?感谢您的快速答复! - 是的,应该使用相同的功能!

以上是关于使用多处理时加入进程是不是有顺序规则?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python上多进程处理数据

如何在python上多进程处理数据

使用三个线程在一个字符后面顺序添加字符

如何按时间顺序使用多处理?

python多线程

python多线程