Pitone, asyncore e forcelle
Domanda
Per i principianti, ho usato ritorto e SocketServer sia con ForkMixIn, ThreadMixIn e provato le ricette "filo-pool".
Tuttavia, ho voluto fare qualcosa di particolare opera in Python.
sfondo Alittle. In precedenza ho scritto in C un semplice demone TCP che legarsi ad una presa di corrente e ascoltare su di esso, quindi pre-forcella X molte volte e poi basta passare il disc ServerSocket a tutte le forcelle e tutti avrebbero accettare i clienti molto molto marrily.
Ho controllato l'asyncore base "selezionare / sondaggio" che mi piace molto. La mia unica manzo era che avrei potuto ottenere un po 'di CPU non legato da sborsare un paio di volte a sfruttare la macchina multi-CPU e sperare per il meglio con la programmazione.
Non posso farlo funzionare per la vita di me. Solo 1 singola istanza può accettare connessioni, tutti gli altri semplicemente generano un'eccezione sulla gestione della connessione, 'non può scorrere attraverso il vuoto'.
questo è ancora fattibile? Ho controllato un sacco, ma non riuscivo a trovare alcun codice per forking asyncore dispatcher (grido)
Grazie!
Aggiornamento 1: (traceback completo come richiesto)
error: uncaptured python exception, closing channel <__main__.EchoServer listening 0.0.0.0:8001 at 0x2ad4880c93f8> (<type 'exceptions.TypeError'>:'NoneType' /python2.6/asyncore.py|readwrite|99] [/usr/local/python2.6.9/lib/python2.6/asyncore.py|handle_read_event|408] [./6py-server.py|handle_accept|87])
Sempre accade in accettare, a prescindere se io bivio prima della asyncore.loop, ecc.
Aggiornamento 2: (fonte completa) pastebined fonte
Soluzione
Si dovrebbe usare il codice di markup per traceback, altrimenti è visualizzato Messed e non vediamo tipo di eccezione.
Ma io credo che è TypeError: 'NoneType' object is not iterable
dal self.accept()
può tornare None
. La ragione è che molti processi possono ottenere leggere evento per l'ascolto presa, ma solo uno può accettarlo. I processi di riposo otterrà errore EWOULDBLOCK
che viene catturato, ma poi ritorna None
invece di coppia di collegamento-indirizzo.
Cambia la handle_accept()
per tornare immediatamente quando accept()
ritorna None
.