【发布时间】: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() 或因进程而异的文件,这样您就不会重复使用同一个文件。
-
这是有道理的,但我认为还有另一种更简单的方法
标签: python sockets process ipc