# asynchat forgets packets when push is called from a thread # python asyn-delay.py # echo "\n" | nc localhost 1100 import socket, asyncore, asynchat, threading, signal def sigend(a, b): quit() signal.signal(signal.SIGINT, sigend) signal.signal(signal.SIGQUIT, sigend) signal.signal(signal.SIGTERM, sigend) class Worker(threading.Thread): def __init__ (self): threading.Thread.__init__(self) self.queue = [] self.work = threading.Event() def run(self): while True: self.work.wait() self.work.clear() while self.queue: sock = self.queue.pop(0) sock.push( (("x"*80)+"\n")*13 ) class server_socket(asyncore.dispatcher): def __init__(self, port): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.set_reuse_addr() self.bind(('', port)) self.listen(5) def handle_accept(self): (csock, addr) = self.accept() client_socket((csock, addr)) class client_socket(asynchat.async_chat): channel_counter = 0 def __init__(self, (csock, addr)): asynchat.async_chat.__init__(self, csock) self.set_terminator("\n") self.id = self.channel_counter self.channel_counter += 1 self.inbuffer = "" def collect_incoming_data(self, data): self.inbuffer += data def found_terminator(self): data = self.inbuffer self.inbuffer = "" worker.queue.append(self) worker.work.set() #self.push( (("x"*80)+"\n")*13 ) def handle_close(self): self.close() worker = Worker() worker.start() server_socket(1100) asyncore.loop(5) #asyncore.loop(0.0001)