Python 2.7 ZeroMQ:为什么不使用多处理的客户机-服务器程序会失败?
我最近遇到了ZeroMQ(Python 2.7 ZeroMQ:为什么不使用多处理的客户机-服务器程序会失败?,python-2.7,multiprocessing,client-server,zeromq,Python 2.7,Multiprocessing,Client Server,Zeromq,我最近遇到了ZeroMQ(pyzmq),我在一个网站上发现了这段非常有用的代码,我对它进行了修改,只进行了一次进程调用。我的代码是: import zmq import sys from multiprocessing import Process port = 5556 def server(): context = zmq.Context() socket = context.socket(zmq.REP) socket.bind("tcp://*:%s" % p
pyzmq
),我在一个网站上发现了这段非常有用的代码,我对它进行了修改,只进行了一次进程调用。我的代码是:
import zmq
import sys
from multiprocessing import Process
port = 5556
def server():
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:%s" % port)
print "Running server on port: %s" % port
# serves only 5 request and dies
#for reqnum in range(4):
# Wait for next request from client
message = socket.recv()
print "Received request : %s from client" % message
socket.send("ACK from %s" % port)
def client():
context = zmq.Context()
socket = context.socket(zmq.REQ)
#for port in ports:
socket.connect ("tcp://localhost:%s" % port)
#for request in range(20):
print "client Sending request to server"
socket.send ("Hello")
message = socket.recv()
print "Received ACK from server""[", message, "]"
time.sleep (1)
if __name__ == "__main__":
Process(target=server, args=()).start()
Process(target=client, args=()).start()
time.sleep(1)
我意识到ZeroMQ功能强大,特别是在多处理
/多线程调用方面,但我想知道是否可以调用服务器
和客户端
方法,而不将它们作为\uu main\uuuuu
中的进程调用。例如,我试着像这样称呼他们:
if __name__ == "__main__":
server()
client()
由于某种原因,服务器
启动了,但客户端却没有启动,我不得不硬退出程序。
有没有办法不用调用进程
来实现这一点?如果没有,那么是否有一个
socket
程序(有或没有客户机-服务器类型的体系结构)的功能与上述程序完全相同?(我想要一个程序,而不是像经典的CL-SE程序那样在不同的终端上运行两个程序)
将Ubuntu 14.04、32位虚拟机与Python-2.7一起使用,只需启动服务器()
处理,而不是客户端()
为什么?
由于纯[SERIAL]
-进程调度已进入服务器()
代码,其中已实例化上下文
实例,因此创建了一个套接字
-实例,接下来是对套接字.recv()的调用
方法将整个流程挂起,进入无限和不可控的等待状态,期望收到一些消息,在本地准备好了
-LY正式的行为模式,但没有实时的交易对手,这将发送任何此类预期消息
是的,分布式计算有几个新的维度(自由度)需要关注——在这个简单的场景中,事件的基本(非)存在和顺序刚刚被识别
无论我在哪里提倡,我都不会使用.recv()
+(你毫无疑问,它什么时候会发生,但有一点是肯定的,一旦发生,你就无法挽救相互僵持的对手)
因此,欢迎进入分布式处理现实的领域,并获得描述性的答案。尽管我理解了您所写的大部分内容,但我仍然有一个未回答的问题:是否有一个
socket
程序(有或没有客户机-服务器类型的体系结构)的功能与上面的类似我需要一个程序,不是两个。哦,当然是。只需始终使用.recv(…)
的非阻塞形式,并调整算法以使用轮询器.poll(…)
来测试消息的存在。单个程序应使用多处理
或并发.futures.ProcessPoolExecutor()
正确启动def
-ed客户端()
和服务器()
,因此整个循环在单个python
解释器终端窗口内进行,如上所示。没有什么不回答的。原始代码被阻止的原因已在原始答案前面解释。修改代码&它将运行