запуск двух сценариев одновременно из основного сценария, когда каждый сценарий содержит несколько потоков в python - PullRequest
1 голос
/ 31 января 2020

Я хочу запустить два или более python сценария одновременно из master script. В каждом из этих сценариев уже есть потоки, которые работают параллельно. Например, я запускаю

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 отдельно. Единственная разница - это параметр, который я передаю классу. Возможно ли иметь главный сценарий таким образом, чтобы, если бы я просто запустил его, оба этих сценария были запущены?

Спасибо

Ответы [ 4 ]

1 голос
/ 31 января 2020

Если вы хотите запустить 2 сценария из основного сценария, вы можете использовать следующий метод. Это поможет вам запустить оба сценария как поток, и поток также может создавать разные потоки на основе вызываемых сценариев. Вы можете даже заставить Сценарии работать независимо.

import subprocess

pid1 = subprocess.Popen([sys.executable, "script1.py"]) 
pid2 = subprocess.Popen([sys.executable, "script2.py"]) 
1 голос
/ 09 февраля 2020

Предполагая, что вы хотите, чтобы вывод обоих сценариев отображался при запуске мастер-сценария.
Вы можете использовать модуль 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()

1 голос
/ 31 января 2020

Да, из c.

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 голосов
/ 09 февраля 2020

Если вы счастливы, что код для обоих вживую находится в одном файле, вы можете использовать многопроцессорную обработку для одновременного запуска их на разных ядрах ЦП.

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