Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 17, 2013 13:12:15

Rumit
Зарегистрирован: 2013-09-16
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Как осторожно остановить программу?

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
не отрабатывает, он его не правильно почему то проверяет на равенство

Офлайн

#2 Сен. 17, 2013 14:33:13

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как осторожно остановить программу?

как вариант использовать модуль signal что бы обрабатывать сигналы типа прерывания с клавиатуры или если UNIX то сигнал завершения приложения SUGTERM



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 17, 2013 16:59:55

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Как осторожно остановить программу?

Rumit
не отрабатывает, он его не правильно почему то проверяет на равенство
может в конце line есть символ ‘\n’

Rumit
а он все равно продолжает работать.
в теории, приложение висит в serversock.accept()
как сказал JOHN_16, сингалы могут помочь (т.к. ассепт находится в главном потоке)
ещё можно попробовать закрыть сервер: serversock.close() , если оно доступно
ещё есть более менее рабочий способ - сделать коннект к серверу из ф-ии stopAll

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version