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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

解決済

1回答

3805閲覧

【python Thread class】メンバ変数をスレッド毎個別に存在させたい

shirai

総合スコア1289

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

0クリップ

投稿2019/07/30 06:44

編集2019/07/30 06:52

質問内容

こんなプログラムを作成し実行してみました。
読みづらく申し訳ございません。

python

1import threading 2 3class P(object): 4 5 def dec_menber(self): 6 self.num = 0 7 8 def lets_thread(func): 9 def lets_thread_w(self, name_list): 10 11 print('all start') 12 13 threadlist = [] 14 for name in name_list: 15 thread = func(self, name) 16 threadlist.append(thread) 17 18 for thread in threadlist: 19 thread.start() 20 21 for thread in threadlist: 22 thread.join() 23 24 print('all end') 25 print(self.num) 26 27 return lets_thread_w 28 29class C(P): 30 31 def multi(self, name): 32 33 super().dec_menber() 34 35 for _ in range(5): 36 print(' ') 37 self.num = self.num + 1 38 39 print(name, self.num) 40 41 @P.lets_thread 42 def thread_func(self, name): 43 return threading.Thread(target=self.multi, args=(name,)) 44 45c = C() 46c.thread_func(['John','Aria','Jack','Lily','Mike','Ella']) 47

実行するたびに結果は変わりました。以下はその一例です。
※print(' ')で出力された空行は除いてあります

all start Aria 5 Jack 1 Mike 6 Lily 10 Ella 15 John 17 all end 17

作成された6つのスレッドは同じプロセス内で動き、
同じメモリを共有する為、このような結果になった

ということはなんとなくわかりますが、
私が欲しかった結果は以下になります。
※名前順は毎回異なってもOK

all start Ella 5 Jack 5 John 5 Aria 5 Mike 5 Lily 5 all end NameError: self.a is not defined

このプログラムをなるべく少ない改修で
欲しかった結果を出力させるにはどうすればよいでしょうか。
できれば class C 以外はいじりたくないのですが・・・。
class Pは他でも使うので、
num はどうしても親クラスで宣言をさせたいです。

なお、このプラグラムは似たようなものを仕事で使おうと考えており、
メンバ変数 num は Selenium の driver に変わる予定ですので、
排他制御ではなく、それぞれメモリ上に異なる変数として存在させたいです。
関数 multi の最終行は self.driver.quit() とする予定です。

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

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

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

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

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

guest

回答1

0

自己解決

もう一つクラスを作り、
そのクラスの中でインスタンスを6つ作ることで解決できました。
プログラム自体が汚いのでそれが課題ですね・・・。

python

1import threading 2 3class P(object): 4 5 def dec_menber(self): 6 self.num = 0 7 8 def lets_thread(func): 9 def lets_thread_w(self, name_list): 10 11 print('all start') 12 13 threadlist = [] 14 for name in name_list: 15 thread = func(self, name) 16 threadlist.append(thread) 17 18 for thread in threadlist: 19 thread.start() 20 21 for thread in threadlist: 22 thread.join() 23 24 print('all end') 25 26 return lets_thread_w 27 28class C(P): 29 30 def multi(self, name): 31 32 super().dec_menber() 33 34 for _ in range(5): 35 print(' ') 36 self.num = self.num + 1 37 38 print(name, self.num) 39 40class K(object): 41 42 def multi_w(self, name): 43 c = C() 44 c.multi(name) 45 46 @P.lets_thread 47 def thread_func(self, name): 48 return threading.Thread(target=self.multi_w, args=(name,)) 49 50 51k = K() 52k.thread_func(['John','Aria','Jack','Lily','Mike','Ella']) 53

投稿2019/07/30 08:07

shirai

総合スコア1289

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問