Я не рекомендую функцию setDaemon для нормального выключения. Это небрежно; вместо того, чтобы иметь чистый путь отключения для потоков, он просто убивает поток без возможности очистки. Хорошо установить его, чтобы ваша программа не застревала, если основной поток неожиданно завершил работу, но это не хороший нормальный путь завершения работы, за исключением быстрых хаков.
import sys, os, socket, threading, time, select
class Server(threading.Thread):
def __init__(self, i_port):
threading.Thread.__init__(self)
self.setDaemon(True)
self.quitting = False
self.serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serversocket.bind((socket.gethostname(), i_port))
self.serversocket.listen(5)
self.start()
def shutdown(self):
if self.quitting:
return
self.quitting = True
self.join()
def run(self):
# Wait for connection
while not self.quitting:
rr,rw,err = select.select([self.serversocket],[],[], 1)
print rr
if rr:
(clientsocket, address) = self.serversocket.accept()
clientsocket.close()
print "shutting down"
self.serversocket.close()
def main():
a = Server(6543)
try:
time.sleep(4)
finally:
a.shutdown()
if __name__=='__main__':
main()
Обратите внимание, что это приведет к задержке на одну секунду после вызова shutdown (), что является плохим поведением. Обычно это легко исправить: создайте канал пробуждения (), в который вы можете писать, и включите его в select; но хотя это очень просто, я не смог найти никакого способа сделать это в Python. (os.pipe () возвращает файловые дескрипторы, а не файловые объекты, в которые мы можем записать.) Я не стал копать глубже, поскольку это касается вопроса.