[解決済み] Pythonでマルチプロセッシングキューを使うには?
2022-07-07 02:25:26
質問
Pythonのマルチプロセッシングキューがどのように動作するのか、またどのように実装するのか理解するのに大変苦労しています。共有ファイルからデータにアクセスする2つのPythonモジュールがあるとします。これらの2つのモジュールをライターとリーダーと呼びましょう。私の計画は、リーダーとライターの両方が2つの別々のマルチプロセッシングキューにリクエストを入れ、そして3番目のプロセスがループでこれらのリクエストをポップして、そのように実行することです。
私の主な問題は、multiprocessing.queue を正しく実装する方法を本当に知らないことです。それらは別々のキューになるので、各プロセスのオブジェクトを本当にインスタンス化することはできません。
どのように解決するのですか?
私の主な問題は、multiprocessing.queue を正しく実装する方法が本当にわからないことです。各プロセスが個別のキューになるため、各プロセスのオブジェクトを本当にインスタンス化することはできませんが、すべてのプロセスが共有キュー(またはこの場合はキュー)に関連していることを確認する方法はあります。
これは、リーダとライタがひとつのキューを共有する簡単な例です... ライターが整数の束をリーダーに送ります。ライターが数を使い果たすと「DONE」を送り、リーダーに読み込みループから抜け出すことを知らせます。
リーダープロセスはいくつでも生成できる
from multiprocessing import Process, Queue
import time
import sys
def reader_proc(queue):
"""Read from the queue; this spawns as a separate Process"""
while True:
msg = queue.get() # Read from the queue and do nothing
if msg == "DONE":
break
def writer(count, num_of_reader_procs, queue):
"""Write integers into the queue. A reader_proc() will read them from the queue"""
for ii in range(0, count):
queue.put(ii) # Put 'count' numbers into queue
### Tell all readers to stop...
for ii in range(0, num_of_reader_procs):
queue.put("DONE")
def start_reader_procs(qq, num_of_reader_procs):
"""Start the reader processes and return all in a list to the caller"""
all_reader_procs = list()
for ii in range(0, num_of_reader_procs):
### reader_p() reads from qq as a separate process...
### you can spawn as many reader_p() as you like
### however, there is usually a point of diminishing returns
reader_p = Process(target=reader_proc, args=((qq),))
reader_p.daemon = True
reader_p.start() # Launch reader_p() as another proc
all_reader_procs.append(reader_p)
return all_reader_procs
if __name__ == "__main__":
num_of_reader_procs = 2
qq = Queue() # writer() writes to qq from _this_ process
for count in [10**4, 10**5, 10**6]:
assert num_of_reader_procs > 0
assert num_of_reader_procs < 4
all_reader_procs = start_reader_procs(qq, num_of_reader_procs)
writer(count, len(all_reader_procs), qq) # Queue stuff to all reader_p()
print("All reader processes are pulling numbers from the queue...")
_start = time.time()
for idx, a_reader_proc in enumerate(all_reader_procs):
print(" Waiting for reader_p.join() index %s" % idx)
a_reader_proc.join() # Wait for a_reader_proc() to finish
print(" reader_p() idx:%s is done" % idx)
print(
"Sending {0} integers through Queue() took {1} seconds".format(
count, (time.time() - _start)
)
)
print("")
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] Spyderを仮想環境で動作させるには?
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] models.pyを複数のファイルに分割する
-
[解決済み] pathlib.Pathオブジェクトの絶対パスを取得するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] pandasのDataFrameから空のセルを含む行を削除する
-
[解決済み] Python Logging でログメッセージが2回表示される件
-
[解決済み] タプルの代わりにリストで出力するZip
-
[解決済み] IPythonの終了確認を無効にする
-
[解決済み] and "と "or "はブール値以外ではどのように作用するか?
-
[解決済み] Pythonで関数の引数として辞書の項目を渡すには?重複
-
[解決済み] Seleniumから要素の属性を取得するには?
-
[解決済み] Python 2 で HEAD HTTP リクエストを送信するには?
-
[解決済み] Pandasがラベルで選択すると、Seriesを返す場合とDataFrameを返す場合があります。
-
[解決済み] PILでPNG画像を文字列に書き出すには?