Я искал ответ на эту проблему в течение нескольких часов, но не смог его решить, поэтому я должен опубликовать здесь этот вопрос, я уверен, что это тривиально.Python: обмен сообщениями между процессами
Проект, с которым я работаю, имеет много классов и потоков, и я добавляю к нему небольшие классы. Эти классы выполняются в разных потоках с движком проекта, но мне нужно, чтобы они синхронизировались между собой - это класс A, должен иметь возможность отправлять сообщение классу B. Они также находятся в разных модулях.
EDIT2: есть новое объяснение этого вопроса: посмотрите на дно.
Я действительно очень новичок в python, и я попытался решить эту проблему путем совместного использования объекта очереди (Queue.Queue()) и изучения его содержимого в бесконечных циклах, я сделал очень простой модуль с этим объектом, и методы get и put :
мессенджер модуль:
import Queue
MessageQueue = Queue.Queue()
def GetMessage():
return MessageQueue.get()
def PutMessage(message):
MessageQueue.put(message)
return
и использовать его в двух разных классов (импорт мессенджеров), но так как это не глобальная переменная, я предполагаю, что объект «MessageQueue» имеет различные экземпляры в разных классах. Потому что эти классы работают в разных очередях.
Как синхронизировать два класса с таким объектом между (возможно, есть способ претьера вместо того, чтобы просто сделать эту очередь глобальной)?
EDIT1 - вот классы:
класса А:
from utils import messenger as m
class Foo():
[...]
def foo():
[...]
m.put(message)
Класс B:
from utils import messenger
class Bar():
[...]
def bar():
[...]
while True:
print(str(m.get()))
EDIT2: Так как я понимаю, моя проблема немного лучше сейчас, здесь это обновление:
Оба класса запускаются как разные программы в разных процессах (что может объяснить, почему они не используют глобальные переменные :)).
Таким образом, проблема остается: как синхронизировать между двумя различными программами? Единственное решение, о котором я думаю, это сделать файл на диске и прочитать его между процессами, но он кажется очень ненадежным (блокировки и т. Д.) И медленным.
Можете ли вы предложить мне другой подход?
Вы сделали фактический класс или просто модуль? – Blender
Вы не показали нам никакого урока здесь; вы только что получили глобальную переменную и две глобальные функции. Таким образом, это не тот код, о котором вы просите, или вы не имеете в виду то же самое, что и «глобальная переменная», что делают большинство людей. – abarnert
@Blender: да, я создал только модуль - исправленный вопрос (это не третий класс, это просто модуль) – msu