前提・実現したいこと
pythonを勉強していてモンテカルロ木探索を使ったオセロを実装しました。
その際に複数の探索結果を出したいと思い、multiprocessingのpoolを使って
同時に複数の探索を行わせようとしました。
その時のコードは以下になります。
Reversi.py
1 #どこに石を置くかを決定する 2 def put_stone(self): 3 4 略 5 6 p = Pool(8) #同時に最大8個の子プロセス 7 8 for i in range(7): 9 p.apply_async(Player_MCTS, args=(None,i+1,)) 10 11 p.close() 12 p.join() 13 """質問には関係ないところです 14 for m in range(3): 15 if len(playerMCTS) < m+1: 16 break 17 """ 18 略 19 20 #モンテカルロ木探索で手を決定する 21 def Player_MCTS(self, times): 22 23 global playerMCTS 24 print('Run task {}'.format(times)) 25 playerMCTS = pMCTS.mctsNextPosition(self.board, DEEP * times) 26 print("探索結果", playerMCTS) 27
一つ目のfor文で8個作ったプロセスにそれぞれ関数Player_MCTSで探索させようとしています。
Player_MCTSでは違うpyファイルの中のモンテカルロ木探索をハイパーパラメータのDEEPと回数で積算で探索の深さを決定し探索させます。
ここでの問題としてこれを実行すると、
File "ReversiUI.py", line 131, in put_stones p.apply_async(Player_MCTS, args=(None,i+1,)) NameError: name 'Player_MCTS' is not defined
というエラーがでて関数がないよと言われます。
なにが原因でどのようにしたら解決するのか全く分からないので教えていただきたいです。
よろしくお願いします。
追記
エラーの部分である
p.apply_async(Player_MCTS, args=(None,i+1,))
を
p.apply_async(self.Player_MCTS, args=(None,i+1,))
に変更して実行したところ、
File "ReversiUI.py", line 187, in put_stones if len(playerMCTS1) < m+1: NameError: name 'playerMCTS' is not defined
というエラーが出て、
poolのところをスルーしてしまいました。
関数のPlayer_MCTSを通らない結果出力されるはずのplayerMCTSが定義されず、
エラーが出ているのかなと思います。
追記
このコードは例文を参考に実装しました。
例文のソースコードは以下のようになります。
from multiprocessing import Pool import os import time import random def long_time_task(self,name): print('Run task {} ({})...'.format(name, os.getpid())) start = time.time() time.sleep(3) end = time.time() print('Task {} runs {} seconds.'.format(name, (end - start))) def main(self): print('Parent process {}.'.format(os.getpid())) p = Pool(8) # 同時に最大4個の子プロセス for i in range(8): p.apply_async(long_time_task, args=(None,i+1,)) # 非同期処理のため、親プロセスは子プロセスの処理を待たずに、 # 次のprintをする print('Waiting for all subprocesses done...') p.close() p.join() print('All subprocesses done.') if __name__ == '__main__': main(None)
このソースコードはうまく実行できます。
問題のソースコードのエラー文を見るにplayerMCTSは関数の名前ではなく、引数の名前として探しているから見つからないのでしょうか?
例文と同じコードを使用してうまくいかない場合、どこを確認すればいいのかわかりません。
追記
最初のソースコードだとわかりづらいかなと思ったので同じような簡易版のソースコードを作成しました。
import time from multiprocessing import Pool class Main(): def main(self): # Pool()を定義 p = Pool() # プロセスを2つ非同期で実行 a = 3 b = 5 result = p.apply_async(nijou, args=(None, a)) result2 = p.apply_async(nijou, args=(None, b)) # 1秒間隔で終了チェックして終了したら結果を表示 for k in range(5): if result.ready(): break print(result.get()) print(result2.get()) def nijou(self,inputs): x = inputs print('input: %d' % x) time.sleep(8) retValue = x * x print('double: %d' % retValue) return(retValue) class MainStart(): def __init__(self): Main.main(None) if __name__ == "__main__": app = MainStart()
これを実行した際のエラー文が以下になります。
Traceback (most recent call last): File "Test.py", line 44, in <module> app = MainStart() File "Test.py", line 39, in __init__ Main.main(None) File "Test.py", line 15, in main result = p.apply_async(nijou, args=(None, a)) NameError: name 'nijou' is not defined
こちらでも定義してあるはずのnijouがないよと言われます。
かなり短いソースコードに絞れたのでこの中に原因があるのかなと思っています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/02 14:04
2021/09/02 14:19
2021/09/02 14:24
2021/09/02 14:28
2021/09/02 14:29
2021/09/02 14:39
2021/09/02 14:42