2016-07-31 22 views
0

現在、私はPython 3.4.3を使用しPyQt5アプリケーションを開発しています。pickle.dumpはGILのためにマルチスレッドのPythonアプリケーションのメインスレッドをブロックします

私のアプリには、QThreadがあり、スレッドによって大量のオブジェクト(100MB)が(pickle)ダンプされています。

しかし、そのオブジェクトをダンプするには1〜2秒かかり、GILのためにメインスレッドを約1〜2秒ブロックします。

どうすればこの問題を解決できますか(メインスレッドをブロックしないでください)?

私は文字列に私のオブジェクトをシリアライズすると、メインスレッドを時間がかかり、それはGILを必要とし、最終的にブロックすることを考える。(私が知っているように、ファイルへの書き込みはGILを必要としない)

私はCythonを使用して考えています、私はCythonの初心者なので、Cythonを使ってこの問題を解決するかどうかはわかりません。

この問題を回避する方法はありますか?

編集:私はmultiprocessingモジュールを試しましたが、相互通信時間(プロセス間で共有メモリ変数を渡す)にも約1〜2秒かかるため、結局のところ利点はありません。

+0

あなたのアプリはマルチスレッドであることが必須ですか?代わりにマルチプロキシを使用すると、GILを取り除くことができます。 –

+0

@RicardoSilveiraマルチプロセッシングモジュールを試しましたが、プロセス間で共有メモリ変数を渡すのに1〜2秒かかるため、結果的に利点はありません。私は私の質問でそれを言及すべきだった。 – asqdf

+0

多分[multiprocessing.sharedctypes](https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.sharedctypes) –

答えて

1

私は私の問題を解決しました。

ソリューションは、私のオブジェクトが本当に簡単な作り

  1. ました。私の場合は、オブジェクトを単純な文字列化された辞書の配列に変換しました。

  2. 私は、ピクルスを使用する代わりにfile.write(stringified_dictionaries)を直接使用しました。これにより、Pythonオブジェクトを文字列にシリアル化する時間が短縮されました。

ディスクI/OがpythonでGILを必要としないので、メインスレッドがブロックされた瞬間だけは本当に短いものだった私のオブジェクトを、変換する瞬間でした。

関連する問題