IoT+WEBのためのホームサーバ計画の7、Pythoneで3つのクラスをスレッドで連携するための親クラスを作る話。
2020-02-12 2020-02-13
なんとなくプログラムって、自分で作り方、使われ方、呼び方とかが、決まってくるものです。
ということで、私の場合にはスレッドにするような場合には、クラスのstaticな関数『create』で、クラスのインスタンスを生成するような形がなんとなく好きなので、それに則って、3つのクラスとそれを統合するクラスと、実行のさせ方を自分のスタイルで書いてみました。
まぁ、ソースを見てみましょう。
3つのクラスはこんな感じで。
import time
#------------------------------------------------------------
class classAA():
def setPtr(self,v):
self.BB,self.CC = v
self.BB.test()
self.CC.test()
def test(self):
print("classAA test")
def exec(self):
for w in range(1000):
time.sleep(1)
print("aa:",w)
def create(v):
a = classAA()
v(a)
#------------------------------------------------------------
class classBB():
def setPtr(self,v):
self.AA,self.CC = v
self.AA.test()
self.CC.test()
def test(self):
print("classBB test")
def exec(self):
for w in range(1000):
time.sleep(1.5)
print("bb:",w)
def create(v):
a = classBB()
v(a)
#------------------------------------------------------------
class classCC():
def setPtr(self,v):
self.AA,self.BB = v
self.AA.test()
self.BB.test()
def test(self):
print("classCC test")
def exec(self):
for w in range(1000):
time.sleep(2.5)
print("cc:",w)
def create(v):
a = classCC()
v(a)
それを統合するクラスはこんな感じで
import threading
from classAA import classAA
from classBB import classBB
from classCC import classCC
class zz():
A = None
B = None
C = None
#--------------------------------
def check(self):
if self.A != None and self.B != None and self.C != None:
self.exec2()
#--------------------------------
def fromA(self,v):
self.A = v
self.check()
#--------------------------------
def fromB(self,v):
self.B = v
self.check()
#--------------------------------
def fromC(self,v):
self.C = v
self.check()
#--------------------------------
def execThread(self,dorry):
t = threading.Thread(target=dorry)
t.start()
#--------------------------------
def exec2(self):
self.A.setPtr((self.B,self.C))
self.B.setPtr((self.A,self.C))
self.C.setPtr((self.A,self.B))
self.execThread(self.A.exec)
self.execThread(self.B.exec)
self.execThread(self.C.exec)
#--------------------------------
def exec(self):
classAA.create(self.fromA)
classBB.create(self.fromB)
classCC.create(self.fromC)
#--------------------------------
if __name__ == '__main__':
Z = zz()
Z.exec()
いや、もちろんこんなめんどいことやらなくても、
import threading
from classAA import classAA
from classBB import classBB
from classCC import classCC
class zz():
#--------------------------------
def execEx(self):
A = classAA()
B = classBB()
C = classCC()
A.setPtr((B,C))
B.setPtr((A,C))
C.setPtr((A,B))
threading.Thread(target=A.exec).start()
threading.Thread(target=B.exec).start()
threading.Thread(target=C.exec).start()
#--------------------------------
if __name__ == '__main__':
Z = zz()
Z.execEx()
これでいいっちゃいいんですが。
で、結果ですが、、、
classBB test
classCC test
classAA test
classCC test
classAA test
classBB test
aa: 0
bb: 0
aa: 1
cc: 0
aa: 2
bb: 1
aa: 3
bb: 2
aa: 4
cc: 1
aa: 5
bb: 3
aa: 6
cc: 2
bb: 4
aa: 7
aa: 8
っと、、たいして面白くもなんともない結果です。
A.setPtr((B,C))
B.setPtr((A,C))
C.setPtr((A,B))
の部分は、互いにクラスインスタンスのポインタをもちあって、まぁなんかテキトーに連携しましょうってことですね。