2

私はネットワーク経由で多くのクエリを実行する必要があるプログラムを持っているので、私がやっていることは作業を並列化することです。それは本当にI / Oバウンドです。私は単純にやっています:

for i in range(options.workers):
    w = Worker(queue, output_queue, options.site)
    w.setDaemon(True)
    w.start()

for i, dataset_metadata in enumerate(datasets_metadata):
    queue.put((i+1, dataset_metadata))

queue.join()

これoptions.workersはコマンドラインから来ます。今、作品数を動的に変えたいと思っています。

最初の質問: の後にワーカーを追加する方法はqueue.join?

2 番目の質問: 実行時に最適なワーカー数を評価する方法は? タスク/時間の速度を監視し、この比率が変わらなくなるまでワーカーの数を増やす必要があると思います。

4

1 に答える 1

1

ワーカーを自分で開始および停止することもできますが、必要な機能の多くはおそらく既に利用可能です。

  • multiprocessing.dummyモジュールは と同じ API をエクスポートしますが、multithreadingプロセスではなくスレッドでのみ実装されます。
    これは、すでに実装されているワーカーを使用できることを意味Poolし、ある時点で必要になった場合に、スレッド化からマルチプロセッシングに簡単に切り替えることができます。
  • API は、concurrent.futuresさらに高度な同時実行モデルを提供します。これは python3.2+ の標準ライブラリにありますが、以前のバージョンのバックポートがあります。
于 2012-06-08T09:04:25.773 に答える