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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top