pythonのマルチプロセスで インスタンスを共有したいです
乗せてるコードはtest用なので一つしか.Processを作っていませんが
複数のProcessで 同じclassの関数 変数を使いたいです
ためしたこと
args=()にインスタンスを入れてみる
import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import torchvision.transforms as T #import torch.multiprocessing as mp import multiprocessing as mp class flan(nn.Module): def __init__(self): super(flan, self).__init__() self.flan=True print("flan_ok") def prints(self): print("def_ok") def train(): print("car") flan.prints() print(flan.flan,"flan_ok") flan.flan=495 print(flan.flan,"add_ok") if __name__ == '__main__': flan=flan() flan.share_memory() p = mp.Process(target=train, args=()) p.start() print("start") p.join() print("close")
flan_ok start car Process Process-1: Traceback (most recent call last): File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\process.py", line 297, in _bootstrap self.run() File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\process.py", line 99, in run self._target(*self._args, **self._kwargs) File "C:\Users\PC_User\Desktop\AGI\testtorch.py", line 20, in train flan.prints() TypeError: prints() missing 1 required positional argument: 'self' close
追記
.share_memory()したあとargeにいれると症状が変わりましたが
動きません Queueという物も見つけましたがなんなのか全くわかりません
複数のProcessで 同じインスタンスの関数 変数を使いたいです 変数はちょくちょくProcessのほうから変更します
Queueのほうがいろいろできると書いてありましたがどっちがいいのでしょうか?
import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F import torchvision.transforms as T #import torch.multiprocessing as mp import torch.multiprocessing as mp class flan(nn.Module): def __init__(self): super(flan, self).__init__() self.flan=True print("flan_ok") def prints(self): print("def_ok") def train(flan): print("car") flan.prints() print(flan.flan,"flan_ok") flan.flan=495 print(flan.flan,"add_ok") if __name__ == '__main__': flan=flan() flan.share_memory() p = mp.Process(target=train, args=(flan,)) p.start() print("start") p.join() print("close")
flan_ok Traceback (most recent call last): File "testtorch.py", line 28, in <module> p.start() File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\process.py", line 112, in start self._popen = self._Popen(self) File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\context.py", line 223, in _Popen return _default_context.get_context().Process._Popen(process_obj) File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\context.py", line 322, in _Popen return Popen(process_obj) File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__ reduction.dump(process_obj, to_child) File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\reduction.py", line 60, in dump ForkingPickler(file, protocol).dump(obj) _pickle.PicklingError: Can't pickle <class '__main__.flan'>: it's not the same object as __main__.flan Traceback (most recent call last): File "<string>", line 1, in <module> File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\spawn.py", line 99, in spawn_main new_handle = reduction.steal_handle(parent_pid, pipe_handle) File "C:\Users\PC_User\Anaconda3\envs\testpyflan\lib\multiprocessing\reduction.py", line 87, in steal_handle _winapi.DUPLICATE_SAME_ACCESS | _winapi.DUPLICATE_CLOSE_SOURCE) PermissionError: [WinError 5] アクセスが拒否されました。
そもそもclassの共有というより、インスタンスの共有ですよね、表現の問題ですが。
ちなみに、並列化するのにインスタンスを共有するのは何か構成がまずい可能性もあるので、並列化するには何が必要で、何を共有すべきかを検討されるとよろしいかと思います。
関数を使いまわしたいのですが 調べてもあまりでてきません
prints() missing 1 required positional argument: 'self'がなんでおきてるのか全く分かりません
.share_memory()したあとargeにいれると症状が変わりましたが
動きません
どのように動かないのかを提示した方がよろしいかと。
ちなみに、print(flan.flan,"flan_ok")は文法的におかしいのでは?これはMultiprocessとか以前の問題。
確かにミスってますね... でもそこまでたどり着けてないので 以前の問題。ではないかと
エラー内容はるのわすれてましたすいません
回答3件
あなたの回答
tips
プレビュー