IoT+WEBのためのホームサーバ計画の7、Pythoneで3つのクラスをスレッドで連携するための親クラスを作る話。

なんとなくプログラムって、自分で作り方、使われ方、呼び方とかが、決まってくるものです。
ということで、私の場合にはスレッドにするような場合には、クラスの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))

の部分は、互いにクラスインスタンスのポインタをもちあって、まぁなんかテキトーに連携しましょうってことですね。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です