Найти - Пользователи
Полная версия: Как осторожно остановить программу?
Начало » Python для новичков » Как осторожно остановить программу?
1
Rumit
from socket import *
import threading
import thread
import sys
def stopAll():
    for i in workerClientList:
        workerClientList[i].stop()
    reader.stop()
    
class WorkerReader(threading.Thread):
    def __init__(self):
        super(WorkerReader,self).__init__()
        self._stop = threading.Event()
        self.daemon = True
    def run(self):
        for line in sys.stdin:
            if (int(line) == 11):
                stopAll()
    def stop(self):
        self._stop.set()
class WorkerClient(threading.Thread):
    def __init__(self, clientsock, addr):
        super(WorkerClient,self).__init__()
        self._stop = threading.Event()
        self.daemon = True
        self.clientsock = clientsock
        self.addr = addr
    def run(self):
        while 1:
            data = clientsock.recv(BUFSIZ)
            if not data:
                break
            msg = 'echoed:... ' + data
            clientsock.send(msg)
        clientsock.close()
    def stop(self):
        clientsock.close()
        self._stop.set()
workerClientList = []
HOST = 'localhost'
PORT = 5013
BUFSIZ = 1024
ADDR = (HOST, PORT)
serversock = socket(AF_INET, SOCK_STREAM)
serversock.bind(ADDR)
serversock.listen(2)
reader = WorkerReader()
reader.start()
while 1:
    print 'waiting for connection...'
    clientsock, addr = serversock.accept()
    print '...connected from:', addr
    newWorkerClient = WorkerClient(clientsock, addr)
    workerClientList.append(newWorkerClient)
    newWorkerClient.start()

Создаю экземпляр WorkerReader, он вроде бы должен проверять строки на наличие числа 11, если да, то закончить программу, а он все равно продолжает работать. Так же перестает работать сам сервер, то есть или клиент получает пустой ответ от эхо сервера, или он вообще не может подключиться, подсмотрел все это дело тут. Все это надо что бы аккуратно отключать сервер, иначе у меня остается занят порт. Помогите пожалуйста!
PS: почему как бы я не делал
import sys
for line in sys.stdin:
    if line == 'exit':
        exit()
    else:
        print 'echo', line
не отрабатывает, он его не правильно почему то проверяет на равенство
JOHN_16
как вариант использовать модуль signal что бы обрабатывать сигналы типа прерывания с клавиатуры или если UNIX то сигнал завершения приложения SUGTERM
o7412369815963
Rumit
не отрабатывает, он его не правильно почему то проверяет на равенство
может в конце line есть символ ‘\n’

Rumit
а он все равно продолжает работать.
в теории, приложение висит в serversock.accept()
как сказал JOHN_16, сингалы могут помочь (т.к. ассепт находится в главном потоке)
ещё можно попробовать закрыть сервер: serversock.close() , если оно доступно
ещё есть более менее рабочий способ - сделать коннект к серверу из ф-ии stopAll
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB