当每个脚本在 python 中都有多个线程时,从主脚本同时运行两个脚本

问题描述 投票:0回答:4

我想从

master script
同时运行两个或多个 python 脚本。这些脚本中的每一个都已经有并行运行的线程。例如我跑步

script1.py

if __name__ == '__main__':
    pid_vav = PID_VAV('B2')
    t1 = threading.Thread(target=pid_vav.Controls)
    t1.daemon = False
    t1.start()
    t2 = threading.Thread(target=pid_vav.mqttConnection)
    t2.daemon = False
    t2.start()

script2.py

if __name__ == '__main__':
    pid_vav = PID_VAV('B4')
    t1 = threading.Thread(target=pid_vav.Controls)
    t1.daemon = False
    t1.start()
    t2 = threading.Thread(target=pid_vav.mqttConnection)
    t2.daemon = False
    t2.start()

我分别运行这个

script1.py
script2.py
。唯一的区别是我传递给类的参数。是否有可能有一个主脚本,这样如果我只运行它,这两个脚本都会运行?

谢谢

python multithreading python-multithreading
4个回答
5
投票

假设您希望在运行主脚本时显示两个脚本的输出。
您可以使用

subprocess
模块来调用 python 文件,并且可以使用
threading
模块来启动单独的线程

from threading import Thread
import subprocess

t1 = Thread(target=subprocess.run, args=(["python", "script1.py"],))
t2 = Thread(target=subprocess.run, args=(["python", "script2.py"],))

t1.start()
t2.start()

t1.join()
t2.join()


2
投票

如果您想从主脚本触发 2 个脚本,您可以使用以下方法。 它将帮助您将两个脚本作为线程触发,并且线程还可以根据可调用脚本生成不同的线程。您甚至可以使脚本独立运行。

import subprocess

pid1 = subprocess.Popen([sys.executable, "script1.py"]) 
pid2 = subprocess.Popen([sys.executable, "script2.py"]) 

1
投票

是的,ofc。

script_master.py:

from os import system
system('start script1.py && start script2.py')

但我认为你可以使用这段代码:

script_together.py:

if __name__ == '__main__':
    todo=[]

    todo.append(threading.Thread(target=lambda: PID_VAV('B2').Controls, daemon=False))
    todo.append(threading.Thread(target=lambda: PID_VAV('B4').mqttConnection, daemon=False))
    for th in todo:
        th.start()
    for th in todo:
        th.join()

0
投票

如果您愿意将两者的代码都放在一个文件中,则可以使用多处理在不同的 CPU 内核上同时运行它们。

import multiprocessing as mp
from threading import Thread

def start_process(pid_vav_label):
    pid_vav, threads = PID_VAV(pid_vav_label), []
    threads.append(Thread(target=pid_vav.Controls))
    threads.append(Thread(target=pid_vav.mqttConnection))
    for thread in threads:
        thread.start()
    # Join if necessary
    for thread in threads:
        thread.join()

if __name__ == '__main__':
    processes = []
    for label in ['B2', 'B4']:
        processes.append(mp.Process(target=start_process, args=(label,)))
        processes[-1].start()
    # Again, can join if necessary
    for process in processes:
        process.join()
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.