(Многопоточность-Python) Как я могу создать сценарий, который запускает два сценария, которые я обычно запускаю с двух разных терминалов?

#python #multithreading #parallel-processing #python-multithreading

#питон #многопоточность #параллельная обработка #python-многопоточность

Вопрос:

У меня есть два сценария a.py , и b.py они отправляют данные друг другу через локальный хост (mqtt), и оба они зависят от файла конфигурации conf.jso n. Я обычно выполняю их в двух разных терминалах,

  • a.py в одном терминале
  • b.py в другом

и все в порядке. Прямо сейчас я пытаюсь создать другой скрипт c.py , который должен делать следующее:

  • для параметра в параметрах
  • Обновить config.json
  • выполните a.py и b.py «в двух разных терминалах»
  • закройте a.py b.py и начните заново с новыми параметрами

Теперь я очень не разбираюсь в этом, поэтому я попытался использовать поток из потока

 from threading import Thread  for parameter in parameter   #update config.json  class exp(Thread):  def __init__(self, name):  Thread.__init__(self)  self.name = name  def run(self):  if self.name == 0:  a.runs()  else:  b.runs()  thread1 = exp(0)  thread1.start()  thread2 = exp(1)  thread2.start()  

a.py и b.py оба сценария заканчиваются:

 def runs():  #whatever runs do if __name__ = 'main':  runs()   

Он работает без ошибок, но не работает. Я совершенно уверен, что для этой проблемы должно быть хорошее и стандартное решение. Есть какие-нибудь идеи? Спасибо!

Ответ №1:

Так что в конце концов я нашел это (грязное) решение…есть какие-нибудь советы по улучшению?

 p = subprocess.Popen(['python', 'random.py']) #initialize a random process just to make sense of the firsts terminate calls in the for cycle.  for parameter in parameters  subprocess.Popen.terminate(p)  #random code  p = subprocess.Popen(['python', 'a.py'])  p = subprocess.call(['python', 'b.py'])  #here I would like to do  #subprocess.Popen.terminate(p)....but it does not work, so I putted the terminate process at the start of the for cycle  

Я не совсем понимаю, что я написал, но это прекрасно работает. Спасибо всем за предыдущие советы, и я надеюсь на дальнейшие объяснения.

Комментарии:

1. Спасибо за обновление вашего решения. Вы должны пометить его как принятый, чтобы он появлялся первым для последующих пользователей. Согласно документации, новый интерфейс-это подпроцесс.запуск, а не подпроцесс. звоните, как я писал ранее — предпочитайте его Попену. Нет причин смешивать бег и Попен. Нет причин открывать и завершать процесс. Возможно, вы захотите использовать shell=True.

2. Обратите внимание, что вызывающие процессы-это очень стандартная и хорошо работающая функциональность. Таким образом, любые ошибки или грязные решения, как правило, связаны с вашим плохим использованием API… вы можете попытаться подробно описать в своем первоначальном посте , что вам нужно с точки зрения связи между процессами, чтобы, возможно, иметь более чистое решение.

Ответ №2:

Вы, наверное , хотите multiprocessing , а не threading библиотеку (посмотрите вверх multiprocessing.Process . Другой довольно эквивалентный вариант-использовать subprocess.run для запуска двух сценариев через оболочку.

Что касается потоков — имейте в виду, что они ограничены из — за блокировки глобального интерпретатора CPython , которая является распространенной реализацией python и которую вы, вероятно, используете.

Комментарии:

1. Спасибо! Я попробую сегодня и отправлю обновления.

2. Поэтому я попытался вызвать два сценария с помощью подпроцесса. Попен, но все равно я не получаю нужного результата. Я думаю, что есть какая-то проблема с синхронизацией. a.py следует отправить вывод на b.py который запускается, а затем отправляет вывод на a.py и т. Д. и т. Д….но по какой-то причине этот процесс кажется компромиссным, между тем нет никаких проблем, если я запущу два сценария в двух разных терминалах.

3. Кроме того, есть ли способ показать выходные данные двух сценариев в двух разных терминалах?

4. Вы можете захватить выходные данные либо путем перенаправления, либо в возвращаемом значении завершенного процесса. Не уверен, что вы подразумеваете под «отправить вывод» — чтобы процессы взаимодействовали друг с другом, вы обычно хотите использовать ту или иную форму IPC, в зависимости от вашего варианта использования. Насколько я видел, вы не упомянули об этом в ОП — вы должны обновить его там, если это действительно так, и это необходимо для решения.

Ответ №3:

вы можете использовать потоковую передачу qt. Qt имеет очень мощную библиотеку именно для этой цели.

Комментарии:

1. опустите голос, потому что не упомянули, что в стандартной библиотеке есть немедленные параметры.

2. Я буду иметь в виду, но я предпочитаю стандартные решения, когда они доступны. Спасибо!