3

次の問題があります。私はいくつかのスレッドを持っています。終了呼び出しのみを待機するメインスレッドと、ファイルをアップロードするスレッドの子があります。残念ながら、子スレッドは、特定のサーバーに接続しようとするとブロックされます。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() には、サーバーへの接続を伴うコード スニペットが含まれています。

4

1 に答える 1

0

スレッド化の代わりにマルチプロセッシング ライブラリの使用を検討することをお勧めします。いくつかの制限がありますが、GIL の問題を回避します。

于 2012-09-25T02:11:23.230 に答える