4

複数の理由 (GIL、メモリ リーク) でthreading、アプリケーションをアプリケーションに変換する必要があります。multiprocessing幸いなことに、スレッドは完全に分離されており、s を介してのみ通信しQueue.Queueます。このプリミティブは でも使用できるmultiprocessingため、すべて問題なく表示されます。さて、この地雷原に入る前に、今後の問題についてアドバイスをお願いしたいと思います。

  1. を介してオブジェクトを確実に転送するにはどうすればよいQueueですか? 提供する必要がありますか__setstate__
  2. putすぐに戻ることに頼ることはできますか( threading Queues のように)?
  3. 一般的なヒント/ヒント?
  4. Python ドキュメント以外に読む価値のあるものはありますか?
4

1 に答える 1

5

パート 1 への回答:

multiprocessing.Queuea (またはその他)を通過する必要があるものはすべてpicklablePipeでなければなりません。これには、s、s、およびsなどの基本型が含まれます。また、トップレベルで複雑すぎないクラスもサポートされます (詳細を確認してください)。ただし、 sを渡そうとすると失敗します。tuplelistdictlambda

パート 2 への回答:

Aputは 2 つの部分で構成されています。キューを変更するにはセマフォが必要で、オプションでフィーダー スレッドを開始します。したがって、他の人が同時に同じことをProcessしようとしない場合(たとえば、書き込みが 1 つしかないため)、高速である必要があります。私にとっては、すべての実用的な目的に十分な速さであることが判明しました。putQueueProcess

パート 3 に対する部分的な回答:

  • プレーンmultiprocessing.queue.Queueにはtask_doneメソッドがないため、ドロップインの代わりとして直接使用することはできません。(サブクラスがメソッドを提供します。)
  • 古いprocessing.queue.Queueバージョンにはqsizeメソッドがなく、新しいmultiprocessingバージョンは不正確です (これを覚えておいてください)。
  • 通常、ファイル記述子は で継承さforkれるため、適切なプロセスでファイル記述子を閉じるには注意が必要です。
于 2010-11-25T11:16:12.350 に答える