Python:在进程之间共享消息

2024-05-13 19:00:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经找了几个小时的问题的答案,但没能解决,所以我把这个问题贴在这里,我相信这是微不足道的。在

我工作的项目有许多类和线程,我正在添加一些小类。这些类用project的引擎在不同的线程中执行,但我需要它们在它们之间进行同步-也就是说,类A应该能够向类B发送消息,它们也在不同的模块中。在

编辑2:这个问题有一个新的解释:看底部。

我是python的初学者,我试图通过共享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类:

^{pr2}$

B类:

from utils import messenger

class Bar():

[...]

def bar():

    [...]
    while True:           
       print(str(m.get()))

EDIT2:既然我现在对我的问题有了更好的理解,这里有一个更新:

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

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

你能给我推荐不同的方法吗?在


Tags: 模块对象方法importmessagegetreturnqueue
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,接收方:

^{pr2}$

这个设置实现了我想要的,也就是说,它将信号从一个程序传输到另一个程序,并且它在相当好的时间内完成(这个非常简单的消息,两个整数的元组,大约在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.foo、和{}都有相同的m对象。在

相关问题 更多 >