Pyro - 防止 NameServer 引发 socket.error 地址已被使用

Pyro - Preventing NameServer from raising socket.error Address already in use

我正在尝试强化用于生产的 Pyro 应用程序。我 运行 遇到以下名称服务器问题。

如果名称服务器关闭并迅速重新打开,似乎有 50% 的几率会抛出以下错误:

socket.error: [Errno 98] Address already in use

这可以通过 运行 window (pyro4-ns) 中的名称服务器进行测试,按 CTRL+C,然后再次 运行。有时我可以连续这样做 10 次没有问题,但接下来的 10 次将提高 socket.error。我发现当我遇到这个错误时,名称服务器大约需要 30 秒才能释放套接字。

我正在使用 supervisord 来控制火焰兵。我发现以下配置可以改善一些问题。值得注意的是,startretries=50 总是比 NameServer 释放套接字所花的 30 秒左右更长的时间。这样,如果进程由于某种原因终止,supervisord 可以启动它而不会失败。

[program:pyro-ns]
command=pyro4-ns
priority=1
startretries=50
autostart=true
autorestart=true

但是,如果在我的客户端执行过程中名称服务器死机,由于这个问题,重新连接到名称服务器需要 30 多秒。我在网络服务器中使用 Pyro 客户端执行 REST 任务,因此这种延迟是不可接受的。

感谢 Irman answer

如果 PYRO_SOCK_REUSE 环境设置为 True,则不会发生此错误,因为它在套接字上设置 SO_REUSEADDR。

或者:

export PYRO_SOCK_REUSE=True
pyro4-ns

或者在 Supervisor 的配置中:

[program:pyro-ns]
environment = PYRO_SOCK_REUSE="True"
command=pyro4-ns