質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

5732閲覧

python マルチプロセスでインスタンスを共有できない

Flan.

総合スコア123

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/16 16:24

編集2021/02/19 17:13

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] アクセスが拒否されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2021/02/16 23:57

そもそもclassの共有というより、インスタンスの共有ですよね、表現の問題ですが。 ちなみに、並列化するのにインスタンスを共有するのは何か構成がまずい可能性もあるので、並列化するには何が必要で、何を共有すべきかを検討されるとよろしいかと思います。
Flan.

2021/02/17 17:00

関数を使いまわしたいのですが 調べてもあまりでてきません prints() missing 1 required positional argument: 'self'がなんでおきてるのか全く分かりません
Flan.

2021/02/19 08:39

.share_memory()したあとargeにいれると症状が変わりましたが 動きません
t_obara

2021/02/19 08:47

どのように動かないのかを提示した方がよろしいかと。 ちなみに、print(flan.flan,"flan_ok")は文法的におかしいのでは?これはMultiprocessとか以前の問題。
Flan.

2021/02/19 17:16

確かにミスってますね... でもそこまでたどり着けてないので 以前の問題。ではないかと エラー内容はるのわすれてましたすいません
guest

回答3

0

自己解決

Queue とpipeが動きました

投稿2021/02/26 15:22

Flan.

総合スコア123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

独立した関数だけを使いまわしたいのであれば、クラスにする必要がありません。
例えば、ある特定のデータに対して所定の機能を適用したいということであれば、クラスにして、特定のデータをクラスに渡すとともに、機能をメソッドとして提供すると良いと思いますが、並列処理の場合、特定のデータは並列処理間で共有しないようにすべきです。

prints() missing 1 required positional argument: 'self'がなんでおきてるのか全く分かりません

printsについてはstaticmethod的な利用をしているからでしょう。クラスインスタンスを共有する必要がないのであれば、全てstaticmethodとすれば良いかと。

投稿2021/02/18 04:28

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Flan.

2021/02/18 11:54

クラスインスタンスを共有する必要はあると思います 関数の中にはself の変数を使ってるものもあるので
t_obara

2021/02/18 13:36

提示されている情報からしか判断できないです。何を参考にされたのかわかりませんが、似たようなコードがいかにあります。とりあえず動かしてみたいということであれば、違う部分がどこなのかよくご確認されると宜しいかと思います。 https://torch.classcat.com/2018/05/28/pytorch-docs-notes-multiprocessing/
guest

0

class を共有するような場合は、multiprocessingではなく、threadingを使うのが普通です。threadingを使う場合は、自動的にclass を共有することができます。

投稿2021/02/16 17:15

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Flan.

2021/02/17 16:54

threadingをいままでは使ってたんですが マルチプロセスに比べ遅いらしいので multiprocessingnにしたいです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問