gpt4 book ai didi

python - zeroRPC:发送响应后继续运行进程

转载 作者:可可西里 更新时间:2023-11-01 02:32:36 25 4
gpt4 key购买 nike

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

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

服务器代码:

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: Lost remote after 10s heartbeat。我知道我可以使用 heartbeat 参数使连接无限期持续,但正如我所说,计算将花费数小时并且不会产生任何响应,因此我认为我不应该保持连接有效。

我读过有关 gevent 的内容,但我不知道如何将它用于此目的(它甚至是完成这项工作的正确工具吗?)。我应该使用 Python 的多处理包来生成子进程或类似的东西吗?如何处理这种事情?

最佳答案

发生这种情况是因为服务器没有发回心跳。主线程在一些非 gevent 协作循环中被阻塞大约 10 秒(默认心跳频率的 2 倍)。

Gevent 协同运行协程(greenlets)。如果协程从不退回到 gevent 循环,它会阻塞循环。

也许您的任务受 CPU 限制,在这种情况下,您试图保持合作,同时在 CPU 上长时间搅动位。您可以通过两种方式使用 zerorpc(和 gevent)运行 CPU 绑定(bind)代码:

  • 定期返回 gevent IOLoop (gevent.sleep(0))。由于默认心跳为 5 秒,并且假设在心跳频率加倍后断开连接,因此您必须大约每 5 秒让步一次以确保安全。

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

    • 一个进程将是您的服务 API,可通过网络访问(启用心跳的 zerorpc.Server)。此进程从不阻塞,并尊重协作调度。
    • 处理密集型计算所需的 CPU 数量与处理数量相同。
    • 您的服务 API 和您的 CPU 绑定(bind)进程与 zerorpc 通信,但这次心跳关闭(并且可能是一个非常长的超时值)。
    • 在服务 API 进程中,您可以控制自己对 CPU 绑定(bind)进程的争用。

关于python - zeroRPC:发送响应后继续运行进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31013472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com