明日のためのプログラムその9。PythonでsocketサーバクラスThreadで受ける
さて、socketのサーバ側の第一段階の最後です。
acceptとしてrecvしたら、そのあとをThreadにしてしまいます。
クライアントにsendするのは、Thread側の責任ということにしときましょう。
前回、recv受け取るのを関数にしたので、そのノリのまま実装します。
呼ぶ方はこうです。
with hiraSockSv('127.0.0.1',12345)as S:
S.setFunc(threadDorry.funcs) #success
S.exec()
なんのことはない,classのstaticなmethodを渡します。
その関数の中でクラスをインスタンス化しようということです。
結果として、こんな感じで。
class threadDorry:
def exec(self,conn,s):
self.C = conn;
self.M = s;
t = threading.Thread(target=self.dorry)
t.start()
def dorry(self):
print("message:{}".format(self.M))
self.C.sendall(b'complete DAYO!') #CLIENTに戻す
for w in range(5):
print(w)
time.sleep(1)
del self #このdelいるのか?
def funcs(conn,mes):
t = threadDorry()
t.exec(conn,mes)
たぶんなのですが、途中のdelは不要な気がします。
最近の言語はガベージなんたらが優秀ですから、どこからも参照されなくなって関数の実行が終わったら勝手に消してくれそうな予感はします。
たしかに、delをコメント化して、大量にスレッドを生成して実行させても、終了したときメモリが戻ってるので、適切に破棄されてるとしか思えません。
まぁ、元来C++屋なのでなんとなく書きたいってだけなんですよね。
で、実行結果ですが、、
Address:127.0.0.1 Port:12345
complete?
one cours !
message:----+----ひらひら1----+----2----+----3----+----4----+----5----+----6
0
complete?
one cours !
message:----+----ひらひら1----+----2----+----3----+----4----+----5----+----6
0
1
complete?
one cours !
message:----+----ひらひら1----+----2----+----3----+----4----+----5----+----6
0
1
2
complete?
one cours !
message:----+----ひらひら1----+----2----+----3----+----4----+----5----+----6
0
1
2
3
complete?
one cours !
message:----+----ひらひら1----+----2----+----3----+----4----+----5----+----6
0
1
2
3
4
1
2
3
4
2
3
4
3
4
4
●
ということで、1秒毎程度にクライアントからリクエストをかけましたが、無事にスレッドが実行されてるようですね。
いやーー、でも、threadDorryクラス、何かコンパクトで美しい。
関数だからfuncでDorryが登場するあたりが、べったり昭和ですが。
まぁ本当はDoryなんですけどね。
まぁあとは、Threadが終わらなかった時とか、タイムアウトの仕組みをつくるくらいですかねー。
っと、思ったところこんな記述が。
> 現状では、優先度 (priority) やスレッドグループがなく、スレッドの破壊 (destroy)、中断 (stop)、
>一時停 止 (suspend)、復帰 (resume)、割り込み (interrupt) は行えません。
ううぅーーん。どうしよ。
multiprocessing でできるのかな。
そしたらterminateで消せるのかな?
なんかsocketをプロセス変えて操作するって、ちょっとやな予感しますよね。
無理かもしれないけど、やってみて報告します。
でも、非同期ならクライアントに応答をsendした後の処理をプロセスにするのは全然大丈夫ですよね。
ということで、
multiprocessing 、そのあとUDP、そのあとWebSocketとつづきます。(o^^o)