当使用multiprocessing
Manager 对象创建服务器并远程连接到该服务器时,客户端需要保持与远程服务器的连接。如果服务器在客户端关闭之前就消失了,客户端将永远尝试连接到服务器的预期地址。
在服务器消失后,我在尝试退出的客户端代码上遇到了死锁,因为我的客户端进程永远不会退出。
如果我del
在服务器关闭之前我的远程对象和我的客户端管理器,该过程将正常退出,但是在使用后立即删除我的客户端的管理器对象和远程对象不太理想。
这是我能做的最好的吗?是否有另一种(更合适的)方法可以断开与远程管理器对象的连接?在服务器关闭和/或连接丢失后,有没有办法干净地退出客户端?
我知道 socket.setdefaulttimeout 不适用于多处理,但是有没有办法专门为多处理模块设置连接超时?这是我遇到问题的代码:
from multiprocessing.managers import BaseManager
m = BaseManager(address=('my.remote.server.dns', 50000), authkey='mykey')
# this next line hangs forever if my server is not running or gets disconnected
m.connect()
更新这在多处理中被破坏了。连接超时需要在套接字级别发生(并且套接字需要是非阻塞的才能做到这一点),但非阻塞套接字会破坏多处理。如果远程服务器不可用,则无法处理放弃建立连接。