#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. Я буду иметь в виду, но я предпочитаю стандартные решения, когда они доступны. Спасибо!