我一直在寻找这个问题的答案几个小时但是无法解决它所以我必须在这里发布这个问题,我相信这是微不足道的。
我使用的项目有很多类和线程,我正在为它添加小类。这些类在项目引擎的不同线程中执行,但我需要它们在它们之间进行同步 - 即A类应该能够向B类发送消息。它们也在不同的模块中。
EDIT2:这个问题有了新的解释:请查看底部。
我在python中真的非常初学者,我试图通过共享队列对象(Queue.Queue())并在无限循环中检查它的内容来解决这个问题,我用这个对象和方法得到并放置了非常简单的模块:< / p>
信使模块:
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:由于我现在对我的问题了解得更好,这里有更新:
这两个类在不同的进程中作为不同的程序运行(这可以解释为什么不共享全局变量:))。
所以问题仍然存在:如何在两个不同的程序之间进行同步?我想到的唯一解决方案是在光盘上创建一个文件并在进程之间读取它,但它看起来非常不可靠(锁等)并且速度很慢。
你能建议我采用不同的做法吗?
答案 0 :(得分:2)
好的,我使用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 :(得分: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.foo
和bar2.foo
都有相同的m
对象。