处理器间通信,一个处理器写入,另一个读取

Posted

技术标签:

【中文标题】处理器间通信,一个处理器写入,另一个读取【英文标题】:Inter-Processor Communications, one processor writes, the other reads 【发布时间】:2014-05-12 17:22:13 【问题描述】:

我将 ZeroMQ 用于 IPC。当一个进程监听一个套接字(管道还是 unix 套接字?)而另一个进程写入时,它可以完美运行。

监听的应用:

...
listener = IPCListener()
listener.startup_thread = Thread(target=listener.serve)
listener.startup_thread.daemon = True
listener.startup_thread.start()

class IPCListener()

    def __init__(self)
        self.context = zmq.Context.instance()
        self.sock = self.context.socket(znq.REP)
        self.sock.connection('ipc:///tmp/myapp')

    def serve(self):
        while True:
            message = self.sock.recv()
            response = self.handle_message(message)
            self.sock.send(response)

    def handle_message(self, message):
        if message == 'foo':
            do_something_useful()

这是经理:

context = zmq.Context.instance()
sock = context.socket(zmq.REQ)
sock.bind('ipc:///tmp/myapp')
sock.send('foo')
response = sock.recv()
print response

问题是我需要运行我的应用程序的多个工作者(进程)。不用说我得到'sock.error: [Error 98] Already in use'

我不知道有没有办法让多个进程读取一个公共套接字?可能用 zmq 是不可能的,但是有什么可以处理的呢?

【问题讨论】:

所有进程都使用相同的连接'ipc:///tmp/myapp'吗?这看起来是个问题。该文件实际上可能已创建/锁定。考虑制作文件 'ipc://tmp/myapp-%d" % os.getpid() 或因进程而异的文件,这样您就不会重复使用同一个文件。 这是有道理的,但我认为还有另一种更简单的方法 【参考方案1】:

处理此问题的常用方法是让您的主进程/线程在套接字上侦听,然后一旦收到消息,将处理交给一个工作进程。

【讨论】:

嗯,我认为这是不可能的。我用 uWSGI 运行了一堆工人。

以上是关于处理器间通信,一个处理器写入,另一个读取的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信、操作系统、管道

Linux cpu-to-cpu 进程间通信

四十进程间通信——管道的分类与读写

linux进程间通信异步信号处理机制

linux进程间通信异步信号处理机制

Linux下进程间通信