プログラムのメイン スレッドにメインループがあります (メインループは、ディスク I/O イベントを待機している DBusGMainLoop です)。イベント ハンドラが呼び出されるたびに、ファイルのコピーのために新しいスレッドが分配されます。この時点で奇妙なことが起こります。イベントが呼び出され、スレッド 1が開始されたとします。スレッド 1return os.listdir(path)
は、2 番目のイベントが発生して2 番目のスレッドが開始されるまで、行 ' ' でブロックされます。その後、スレッド 1は正常に動作し続けますが、スレッド 2はブロックされます。また、Ctrl-C でメインループを中断すると、両方のスレッドが機能することにも気付きましたが、明らかにメイン スレッドはイベントの待機を停止します。
なぜこれが起こるのか、誰かが何かヒントを与えることができますか?
このコードは、メイン関数で実行されます。
mainloop = gobject.MainLoop()
mainloop.run()
これは、イベント ハンドラーが新しいスレッドを開始する場所です。
agent = CopyingAgent(mount_point)
agent.start()
これは、スレッドがブロックされているように見える方法です。
def sorted_listdir(self, path):
return sorted(os.listdir(path))