Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python zeroRPC:在发送响应后继续运行进程_Python_Tcp_Messaging_Zerorpc - Fatal编程技术网

Python zeroRPC:在发送响应后继续运行进程

Python zeroRPC:在发送响应后继续运行进程,python,tcp,messaging,zerorpc,Python,Tcp,Messaging,Zerorpc,我正在使用Python2.7并使客户机和服务器通信。我希望客户端向服务器发送一个请求,并希望服务器发送一个响应以确认它已收到该请求。但是,我希望服务器对该请求执行一些繁重的计算。这些计算将花费数小时,并且不会产生任何响应,因此客户不应该一直等待;客户端-服务器连接应在服务器确认已收到请求后立即终止。我该怎么做 这是我现在所拥有的(简化) 服务器代码: impor time import zerorpc class HelloRPC(object): def hey(self, name

我正在使用Python2.7并使客户机和服务器通信。我希望客户端向服务器发送一个请求,并希望服务器发送一个响应以确认它已收到该请求。但是,我希望服务器对该请求执行一些繁重的计算。这些计算将花费数小时,并且不会产生任何响应,因此客户不应该一直等待;客户端-服务器连接应在服务器确认已收到请求后立即终止。我该怎么做

这是我现在所拥有的(简化)

服务器代码:

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(
    gevent.sleep(0)
    )。由于默认心跳为5s,并且假设心跳频率翻倍后会断开连接,因此您必须大致每隔5s进行一次屈服,以确保安全

  • 更通用的解决方案是在自己的进程中运行CPU绑定的代码(例如,每个CPU一个进程):

    • 一个进程将是网络可访问的服务API(zerorpc.Server,启用心跳信号)。这个过程从不阻塞,并且尊重协作调度
    • 尽可能多的处理器用于密集计算
    • 您的服务API和CPU绑定的进程与zerorpc通信,但这次关闭了心跳(可能是很长的超时值)
    • 在服务API进程中,您可以控制自己与CPU绑定进程的争用

但是如果我选择选项2,我真的需要服务API和CPU绑定的进程来通信吗?这些进程不会向服务API返回任何值。那么,我不能完全停止通信,让进程自己存在吗?是的,如果您的客户端(或服务器的API进程)不需要知道CPU绑定进程何时终止,并且您不需要阻止CPU绑定进程的多个实例一起运行(如果多个调用您的服务产生).就软件包/库而言,我应该使用什么?是gevent做的吗?多处理软件包?还有别的吗?