0

我一直在寻找这个问题的答案几个小时,但无法解决,所以我必须在这里发布这个问题,我敢肯定它是微不足道的。

我使用的项目有很多类和线程,我正在向它添加小类。这些类使用项目的引擎在不同的线程中执行,但我需要它们在它们之间进行同步——即 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

并在两个不同的类(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:因为我现在更好地理解了我的问题,所以这里有一个更新:

这两个类在不同的进程中作为不同的程序运行(这可以解释为什么它们不共享全局变量:))。

所以问题依然存在:如何在两个不同的程序之间进行同步?我想到的唯一解决方案是在磁盘上制作一个文件并在进程之间读取它,但它似乎非常不可靠(锁定等)并且速度很慢。

你能建议我不同的方法吗?

4

2 回答 2

4

好的,我使用零 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. 发布者正在“绑定”,订阅者正在“连接”到套接字
于 2013-08-02T23:27:36.913 回答
0

在多个实例(不同类、同一个类等)之间共享任何对象而不使其成为全局对象的方法是相同的:将对象传递给每个实例的构造函数。例如:

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)

现在bar1, bar2,bar1.foobar2.foo都具有相同的m对象。

于 2013-08-02T01:01:38.177 回答