簡體   English   中英

當每個腳本在 python 中包含多個線程時,從主腳本同時運行兩個腳本

[英]running two scripts simultaneously from a master script when each script has multiple threads within it in python

我想從一個master script腳本同時運行兩個或多個 python 腳本。 這些腳本中的每一個都已經包含並行運行的線程。 例如我跑

腳本1.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()

腳本2.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.pyscript2.py 唯一的區別是我傳遞給類的參數。 是否有可能有一個主腳本,如果我只運行它,這兩個腳本都會運行?

謝謝

假設您希望在運行主腳本時顯示兩個腳本的輸出。
可以利用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()

是的,ofc。

script_master.py:

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

但我認為您可以使用此代碼:

腳本_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()

如果您想從主腳本觸發 2 個腳本,您可以使用以下方法。 它將幫助您將兩個腳本作為線程觸發,並且該線程還可以根據可調用腳本生成不同的線程。 您甚至可以讓腳本獨立運行。

import subprocess

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

如果您很高興將兩者的代碼保存在一個文件中,您可以使用多處理在不同的 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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM