前提
python subprocess で実行したpyファイルの関数内にあるmultiprocessが実行されず動作しない
地の文でマルチプロセスをすることはできましたが関数内部でマルチプロセスできる方法を探しています。ただし必須ではなく、関数と呼び出し場所の位置が離れていると、編集するときに不便であるという理由なので、外部関数であっても、任意の位置で宣言できる(内部に書いた記述を外部で宣言する)といった方法でも大丈夫です
(追記)実際のプログラムは量が多く、今後も何度も編集する予定なので、地の文が宣言できる場所で宣言すると、プログラムの編集の時に関数と呼び出す位置が離れすぎて書き替えが不便なので難しいです。
実現したいこと
- マルチプロセスが動作させる
- マルチプロセスを呼び出した場所とその関数が近い場所にあること(実際のプログラムは長いため地の文に書こうとすると離れた位置になりどこで使う関数かわかりにくくなるので)
- できるだけ可読性を下げない
関数の構造を維持したまま(内部関数のまま)マルチプロセスを行う。
発生している問題・エラーメッセージ
エラーは出ませんがプログラムが止まったまま動きません
該当のソースコード
コンソール上でのコマンド
python
1python3 a.py
a.py
python
1from subprocess import run 2run(["python3","b.py"])
b.py
python
1def c(): 2 from concurrent.futures import ProcessPoolExecutor 3 import numpy as np 4 def d (i): 5 print(i) 6 pool = ProcessPoolExecutor(max_workers=4) 7 for i in range(10): 8 pool.submit(d,i) 9 pool.shutdown() 10 11c()
試したこと
ググろうとしましたが、知りたい情報がヒットせず挫折しました(ググり方が悪いのかmultiprocessを使ってsubprocessを行う記述ばかりで私がしたいことを調べることができませんでした)
私が言っていることを実現する解決方法の一つは、サンプルプログラムの
a.py
python
1from subprocess import run 2 3f2=open('b.py',encoding="utf-8") 4str1=f2.read() 5str1=str1.replace(何らかの書き換える処理)#実際はreを使った正規表現でもっと複雑な置き換えをする 6f2.close() 7run(["python3","b.py"])
でb.pyの内容を書き換えれば、編集時は関数内部に記述し、実行時のみ関数外部に書き込むという処理をすることで実現できますが、可読性と、編集したい時の変更作業が難しくなるので、この方法は避けたいです
上にあげた方法のように、かなり無理のあるやり方でもいいので、内部関数でマルチプロセスを行う方法 または
外部関数を別の関数の内部に記述できる方法をお教えいただけると幸いです
補足情報(FW/ツールのバージョンなど)
ubuntu 21 LTS
anaconda 2021_11
python 3.9
参考
回答2件
あなたの回答
tips
プレビュー