[解決済み] Python Process Poolは非貴重?
2022-08-03 04:18:52
質問
PythonのPoolで非発音型のものを作ることは可能でしょうか?私は、プールが内部に別のプールを持つ関数を呼び出すことができるようにしたいです。
deamonプロセスはプロセスを作成することができないので、私はこれが欲しいです。具体的には、それはエラーを引き起こします。
AssertionError: daemonic processes are not allowed to have children
例えば、次のようなシナリオを考えてみましょう。
function_a
を実行するプールがある場合を考えてみましょう。
function_b
を実行するプールを持つ
function_c
. この関数チェーンは失敗します。
function_b
はデーモンプロセスで実行されており、デーモンプロセスはプロセスを作成することができないためです。
どのように解決するのですか?
この
multiprocessing.pool.Pool
クラスはワーカープロセスをその
__init__
メソッドで作成し、デーモン化し、起動します。
daemon
属性を
False
を追加することができます (その後、それはもう許されません)。しかし、独自のサブクラスを作成することで
multiprocesing.pool.Pool
(
multiprocessing.Pool
は単なるラッパー関数です)に置き換え、独自の
multiprocessing.Process
サブクラスで、ワーカープロセスに使用するために常に非デモニックです。
以下は、この方法の完全な例です。重要な部分は、2つのクラス
NoDaemonProcess
と
MyPool
を上部に配置し
pool.close()
と
pool.join()
を、あなたの
MyPool
のインスタンスを最後に追加します。
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import multiprocessing
# We must import this explicitly, it is not imported by the top-level
# multiprocessing module.
import multiprocessing.pool
import time
from random import randint
class NoDaemonProcess(multiprocessing.Process):
# make 'daemon' attribute always return False
def _get_daemon(self):
return False
def _set_daemon(self, value):
pass
daemon = property(_get_daemon, _set_daemon)
# We sub-class multiprocessing.pool.Pool instead of multiprocessing.Pool
# because the latter is only a wrapper function, not a proper class.
class MyPool(multiprocessing.pool.Pool):
Process = NoDaemonProcess
def sleepawhile(t):
print("Sleeping %i seconds..." % t)
time.sleep(t)
return t
def work(num_procs):
print("Creating %i (daemon) workers and jobs in child." % num_procs)
pool = multiprocessing.Pool(num_procs)
result = pool.map(sleepawhile,
[randint(1, 5) for x in range(num_procs)])
# The following is not really needed, since the (daemon) workers of the
# child's pool are killed when the child is terminated, but it's good
# practice to cleanup after ourselves anyway.
pool.close()
pool.join()
return result
def test():
print("Creating 5 (non-daemon) workers and jobs in main process.")
pool = MyPool(5)
result = pool.map(work, [randint(1, 5) for x in range(5)])
pool.close()
pool.join()
print(result)
if __name__ == '__main__':
test()
関連
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] バブルソートの宿題
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonでスレッドから戻り値を取得する方法は?
-
[解決済み] マルチプロセシングプールに似たスレッディングプール?
-
[解決済み] DataFrameの文字列、dtypeがobjectの場合
-
[解決済み] SQLAlchemy: 日付フィールドをフィルタリングする方法は?
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] Ctrl-CでPythonスクリプトを終了できない
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] PythonのRequestsモジュールを使ってWebサイトに "ログイン "するには?