我有一个服务器进程,它接收来自web客户端的请求。服务器必须调用一个外部工作进程(另一个.py ),该进程将数据流式传输到服务器,而服务器将数据流返回给客户端。
服务器必须监控这些工作进程,并向它们发送消息(基本上是终止它们或发送消息来控制哪种类型的数据被流式传输)。这些消息是异步的(例如,依赖于web客户端)
我想过在ipc://传输类上使用ZeroMQ套接字,但是对socket.recv()方法的调用是阻塞的。
我是否应该使用两个套接字(一个用于将数据流式传输到服务器,另一个用于从服务器接收控制消息)?
发布于 2017-09-10 20:43:31
使用单独的套接字进行信令和消息传递总是更好的
虽然Poller-instance会有一些帮助,但最基本的一步是使用单独的socket进行信令,并使用另一个socket进行数据流。一直都是。关键在于,在这种设置中,Poller.poll()和事件循环都可以在实时受控代码执行期间保持特定于套接字,并且花费的时间不超过预定义的时间量。
因此,请毫不犹豫地设置一个更丰富的信令/消息传递基础设施作为一个环境,在这个环境中,您只会享受到控制的简单性、关注点的分离和意图的清晰。
ZeroMQ是一个很好的工具,可以做到这一点--包括每个套接字的IO-线程亲和性,因此您可以轻松地进行细粒度的性能调优。
发布于 2017-09-11 07:00:44
我想如果想出一个解决方案,但我不知道是否有更好的(更有效,更安全,...)做这件事的方式。client向server发出请求,后者产生N进程worker来处理该请求。
以下是worker.py的相关摘录
for i in range(start_counter,10):
# Check if there is any message from server
while True:
try:
msg = worker.recv(zmq.DONTWAIT)
print("Received {} from server".format(msg))
except zmq.Again:
break
# Send data to server
worker.send(b"Message {} from {}".format(i, worker_id))
# Take some sleep
time.sleep(random.uniform(0.3, 1.1))这样,worker a)不需要单独的套接字,b)不需要单独的线程来处理来自server的消息。
在实际实现中,worker必须以100 10的频率向server发送128字节的消息,并且server必须接收大量这样的消息(许多客户端请求请求,每个客户端需要3-10 worker )。如果以这种方式实现,这种方法是否会对性能造成影响?
https://stackoverflow.com/questions/46139185
复制相似问题