Python zeroRPC:在发送响应后继续运行进程
我正在使用Python2.7并使客户机和服务器通信。我希望客户端向服务器发送一个请求,并希望服务器发送一个响应以确认它已收到该请求。但是,我希望服务器对该请求执行一些繁重的计算。这些计算将花费数小时,并且不会产生任何响应,因此客户不应该一直等待;客户端-服务器连接应在服务器确认已收到请求后立即终止。我该怎么做 这是我现在所拥有的(简化) 服务器代码:Python zeroRPC:在发送响应后继续运行进程,python,tcp,messaging,zerorpc,Python,Tcp,Messaging,Zerorpc,我正在使用Python2.7并使客户机和服务器通信。我希望客户端向服务器发送一个请求,并希望服务器发送一个响应以确认它已收到该请求。但是,我希望服务器对该请求执行一些繁重的计算。这些计算将花费数小时,并且不会产生任何响应,因此客户不应该一直等待;客户端-服务器连接应在服务器确认已收到请求后立即终止。我该怎么做 这是我现在所拥有的(简化) 服务器代码: impor time import zerorpc class HelloRPC(object): def hey(self, name
impor time
import zerorpc
class HelloRPC(object):
def hey(self, name):
print 'Hey, %s' % name # just so I can check that the request was received
# send response confirming that request was received
# terminate connection
time.sleep(100000000000000) # some heavy computations
s = zerorpc.Server(HelloRPC())
s.bind('tcp://0.0.0.0:4242')
s.run()
客户端代码:
import zerorpc
c = zerorpc.Client()
c.connect('tcp://MyServerName:4242')
c.hey('macarena')
它不起作用:我得到zerorpc.exceptions.LostRemote:10s心跳后失去远程
。我知道我可以使用heartbeat
参数使连接无限期地持续下去,但正如我所说的,计算将花费数小时并且不会产生响应,因此我认为我不应该让连接保持活动状态
我读过关于gevent的文章,但我不知道如何将它用于此目的(它是适合此工作的工具吗?)。我应该使用Python的多处理包来生成子进程或类似的东西吗?这种事情怎么办?发生这种情况是因为服务器没有发回心跳。主线程在一些非gevent协作循环中被阻塞大约10秒(默认心跳频率的2倍) Gevent协同运行您的协同程序(greenlets)。如果一个协程永远不会返回到gevent循环,它就会阻塞该循环 也许您的任务受CPU限制,在这种情况下,您试图保持合作,同时长时间在CPU上搅动位。有两种方法可以使用zerorpc(和gevent)运行CPU绑定的代码:
- 定期返回gevent IOLoop(
)。由于默认心跳为5s,并且假设心跳频率翻倍后会断开连接,因此您必须大致每隔5s进行一次屈服,以确保安全gevent.sleep(0)
- 更通用的解决方案是在自己的进程中运行CPU绑定的代码(例如,每个CPU一个进程):
- 一个进程将是网络可访问的服务API(zerorpc.Server,启用心跳信号)。这个过程从不阻塞,并且尊重协作调度
- 尽可能多的处理器用于密集计算
- 您的服务API和CPU绑定的进程与zerorpc通信,但这次关闭了心跳(可能是很长的超时值)
- 在服务API进程中,您可以控制自己与CPU绑定进程的争用