簡體   English   中英

Python:在進程之間共享消息

[英]Python: sharing message between processes

我一直在尋找這個問題的答案幾個小時但無法解決它所以我必須在這里發布這個問題,我相信這是微不足道的。

我使用的項目有很多類和線程,我正在為它添加小類。 這些類在項目引擎的不同線程中執行,但我需要它們在它們之間進行同步 - 即A類應該能夠向B類發送消息。它們也在不同的模塊中。

編輯2:這個問題有一個新的解釋:看看底部。

我在python中真的非常初學者,我試圖通過共享隊列對象(Queue.Queue())並在無限循環中檢查它的內容來解決這個問題,我用這個對象和方法得到並放置了非常簡單的模塊:

信使模塊:

import Queue

MessageQueue = Queue.Queue()

def GetMessage():
    return MessageQueue.get()

def PutMessage(message):
    MessageQueue.put(message)
    return

並在兩個不同的類(import messenger)中使用它,但由於它不是全局變量,我假設'MessageQueue'對象在不同的​​類中有不同的實例。 因為這些類似乎在不同的隊列上工作。

如何在這兩個類之間同步這樣的對象(也許有一種更好的方式,而只是讓這個隊列全局化)?

EDIT1 - 這是課程:

A類:

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:既然我現在對我的問題了解得更好了,這里有一個更新:

這兩個類在不同的進程中作為不同的程序運行(這可以解釋為什么不共享全局變量:))。

所以問題仍然存在:如何在兩個不同的程序之間進行同步? 我想到的唯一解決方案是在光盤上創建一個文件並在進程之間讀取它,但它看起來非常不可靠(鎖等)並且速度很慢。

你能建議我采用不同的方法嗎?

好的,我使用Zero MQ庫解決了這個問題。

節點A,發布者:

import zmq, time
from datetime import datetime

context = zmq.Context()

#create this node as publisher
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:25647")


for i in range(300):
   message = ("%d, %d" % (1, i))
   print str(datetime.now().time()) + "> sending: " + message
   socket.send(message)
   time.sleep(1)

節點B,接收器:

import zmq, time
from datetime import datetime

context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:25647")

#filter message for particular subscriber ('1')
socket.setsockopt(zmq.SUBSCRIBE, '1')

while True:
    message = socket.recv()
    print(str(datetime.now().time()) + "> received: " + str(message))

這個設置做了我想要的,也就是說,它將信號從一個程序傳送到另一個程序,並且它在相當好的時間內完成(這個非常簡單的消息,兩個整數的元組,在大約0.5毫秒內發送)。

兩件重要的事情:

  1. 訂閱必須被“授權”才能接收消息 - 它是通過過濾消息的第一個值來完成的
  2. 發布者是“綁定”,訂閱者“連接”到套接字

在多個實例(不同類,同一類,無論什么)之間共享任何對象而不使其全局化的方法是相同的:將對象傳遞到每個實例的構造函數中。 例如:

class Foo(object):

    def __init__(self, m):
        self.m = m
        # ...

    # ...

    def foo(self):
        # ...
        self.m.put(message)
        # ...

# ...

class Bar(object):

    def __init__(self, m):
        self.m = m
        self.foo = Foo(m)
        # ...

    # ...

    def foo(self):
        # ...
        self.m.put(message)
        # ...

# ...

m = Queue.Queue()
bar1 = Bar(m)
bar2 = Bar(m)

現在bar1bar2bar1.foobar2.foo都具有相同的m對象。

暫無
暫無

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

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