🔚
【Python】Socket ServerをCtrl+Cで停止できない問題
Server 側でCtrl +C が効かなくなる
有名な不具合
調べてみれば、先人も同じ不具合に対峙していた記録がみられました。どうやら、既に知れた不具合だったようですね。
上の内容に倣いsignal
によって停める方法を試してみるも、停めることはできず。按ずるに、
本題
唯に動いているものを停めるのみだと言うのに、徒に複雑な仕組みを設けては、作業量が割に合いません。希わくは、単純明快な仕組みで停めたいものです。
そこでThread
を使ってみたところ、意図した通り停めることができました。
server.py
from socket import socket
from threading import Thread
import time
# 無限ループ
def loop():
# 例外が起こるまで何もせず待機
try:
while True:
pass
# 例外が起こると終了する
except:
exit(0)
# Socket Server
def main():
ADDRESS = ("127.0.0.1", 12345)
BUFFER_SIZE = 1024
with socket() as server:
server.bind(ADDRESS)
server.listen()
print(f"Server: {ADDRESS[0]}:{ADDRESS[1]}\n")
while True:
clientSocket, clientAddress = server.accept()
print(f"{clientAddress} connected")
with clientSocket:
# 受信するだけで返信はしていない
clientData = clientSocket.recv(BUFFER_SIZE).decode()
print(clientData)
time.sleep(1)
# main()を並行処理として分離する
serverThread = Thread(
target = main,
daemon = True
)
serverThread.start()
# loop()を主たる処理として実行する
loop()
これで、loop()
が感知してくれるのでしょう。
なお、
psで確認
本当に停止しているのか、実は秘密裏に動いているのではないかと気になったので、ps
で確認してみることにしました。
先ずは
特に何も動かしていない時
PS C:\> ps
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
# 中略
87 45.46 121.44 1.52 4060 2 pwsh
79 33.24 101.05 1.19 16052 2 pwsh
15 10.07 8.53 0.00 7836 0 RAPS
# 以下略
ここで、ps
用とpython
用に二つ開いています。次に、先のプログラムを実行します。
server.pyが動いている時
PS C:\> ps
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
# 中略
88 46.77 122.59 1.41 4060 2 pwsh
80 35.03 101.20 1.09 16052 2 pwsh
13 8.53 14.61 38.14 4152 2 python
15 10.07 8.53 0.00 7836 0 RAPS
# 以下略
確かにpython
とあります。最後に、プログラムを停止します。
停止後
PS C:\> ps
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
# 中略
87 44.28 120.52 1.61 4060 2 pwsh
79 33.80 101.31 1.27 16052 2 pwsh
15 10.07 8.52 0.00 7836 0 RAPS
# 以下略
python
が消えたことを確かめました。
跋
手段としては比較的素直ですから、理解も実装も容易ではないでしょうか。しかしsignal
の方が実装は簡潔ですから、動作するのであればそちらに及くはなしと信じます。
Discussion