次の問題があります。私はいくつかのスレッドを持っています。終了呼び出しのみを待機するメインスレッドと、ファイルをアップロードするスレッドの子があります。残念ながら、子スレッドは、特定のサーバーに接続しようとするとブロックされます。Linuxでpython2.7を使用しています。
メインスレッドには次のコードが含まれています。
for i in xrange(n):
upl = UploaderThread(self.user, self.password)
upl.start()
while threading.active_count() > 1:
time.sleep(1000.)
そして、これは子スレッドがハングするフラグメントです
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(glob_timeout)
#this fragment of code is accessed
sock.connect( ("95.211.193.147", 8084 ) ) <- here the child-thread is blocked
#this fragment of code is not accessed anymore
sock.send(header)
私は何を間違っていますか?
同じプログラムのいくつかのコピーを実行すると (すべてのコピーが 1 つのアップロード スレッドになります)、すべて問題ありません。これは、サーバーが 1 つのクライアントから複数の接続を許可することを意味します。
メインスレッドがない場合、つまり、この方法でメインスレッドを変更すると(待機ループを削除すると)、すべてが機能します。
for i in xrange(n):
upl = UploaderThread(self.user, self.password)
upl.start()
その後、メインスレッドが終了すると、すべての子スレッドが機能します (ブロックされなくなります)。
他のサーバー ( "95.211.193.147", 8084 ではない) に接続しようとすると、子スレッドはメインスレッドによってブロックされません。
何が起こっているのか本当にわかりません。
UploaderThread の定義
class UploaderThread(threading.Thread):
def __init__(self, user, password):
threading.Thread.__init__(self)
self.uploader = Uploader(user, password)
self.daemon = False
def run(self):
self.uploader.upload_dir()
self.uploader.upload_dir() には、サーバーへの接続を伴うコード スニペットが含まれています。