Manager オブジェクトを使用multiprocessing
してサーバーを作成し、そのサーバーにリモート接続する場合、クライアントはリモート サーバーへの接続を維持する必要があります。クライアントがシャットダウンする前にサーバーがなくなった場合、クライアントはサーバーの予想されるアドレスに永遠に接続しようとします。
クライアント プロセスが終了しないため、サーバーがなくなった後に終了しようとしているクライアント コードでデッドロックが発生しています。
サーバーがダウンする前にdel
リモート オブジェクトとクライアント マネージャを削除すると、プロセスは正常に終了しますが、使用直後にクライアントのマネージャ オブジェクトとリモート オブジェクトを削除するのは理想的とは言えません。
それが私にできる最善のことですか?リモート マネージャ オブジェクトから切断する別の (より適切な) 方法はありますか? サーバーがダウンしたり、接続が失われたりした後、クライアントをきれいに終了する方法はありますか?
socket.setdefaulttimeout が multiprocessing で機能しないことは知っていますが、特に multiprocessing モジュールの接続タイムアウトを設定する方法はありますか? これは私が問題を抱えているコードです:
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()
更新これはマルチプロセッシングで壊れています。接続タイムアウトはソケット レベルで発生する必要があります (そして、これを行うにはソケットがノンブロッキングである必要があります) が、ノンブロッキング ソケットはマルチプロセッシングを中断します。リモートサーバーが利用できない場合、接続を断念することはできません。