私は多くの個別のタスクをこなす仕事をしています。タスクごとに、データをダウンロードして処理し、再度アップロードする必要があります。
処理にマルチプロセッシング プールを使用しています。
よくわからない問題がいくつかあります。
まず、データはおおよそ20MBまで可能です。理想的には、メモリ内で物理的に移動せずに子ワーカープロセスに取得し、結果のデータを移動せずに親プロセスに戻します。一部のツールがフードの下でどのように機能しているかわからないので、プールの引数としてデータを渡すことができるかどうかはわかりませんapply_async
(私の理解では、オブジェクトをシリアル化し、到達したら再び作成されます)サブプロセス?)、またはマルチプロセッシングを使用する必要があるかどうQueue
かmmap
? または、他の何か?
私はctypes オブジェクトを見ましたが、プロセスフォークを共有できるときにプールが作成されたときに定義されたオブジェクトのみを理解していますか? 共有する必要のある新しいデータが継続的に入ってくるので、これは私にとっては良くありません。
心配する必要のないことの 1 つは、データへの同時アクセスであるため、どのような種類のロックも必要ありません。これは、データがダウンロードされてから処理が開始され、アップロードも出力データが生成されてから開始されるためです。
私が抱えているもう 1 つの問題は、受信するタスクが急増することがあり、その結果、子プロセスが処理できるよりも速くタスクのデータをダウンロードしていることです。そのため、タスクを完了してデータを破棄するよりも早くデータをダウンロードしていますが、Python はメモリ不足で死んでいます。メモリがほぼいっぱいになったとき、またはジョブ パイプラインのデータが多すぎるときに、ダウンロード段階でタスクを遅らせるにはどうすればよいでしょうか? データバイト数を使用してある種の「ref」カウントを考えていたので、ダウンロードとアップロードの間のデータ量を制限し、数値がしきい値を下回ったときにのみダウンロードできます。子供が時々失敗するのではないかと心配していましたが、子供が持っていたデータをカウントから除外することはできませんでした. このようなことを達成する良い方法はありますか?