Pregunta

Sólo para empezar, he utilizado trenzado y SocketServer tanto con ForkMixIn, ThreadMixIn y trató las recetas "thread-pool".

Sin embargo, yo quería hacer algo de trabajo en particular en Python.

Un poco fondo. X Anteriormente he escrito en C un simple demonio TCP que se unen a una toma de corriente y escuchar en él, luego pre-horquilla muchas veces y luego simplemente pasar el desc ServerSocket a todos los tenedores y todo el mundo aceptaría los clientes muy, muy marrily.

Fui a ver el asyncore "seleccionar / sondeo", basada, que me gusta mucho. Mi carne fue que pude conseguir un poco de CPU no unido al bifurcar un par de veces para tomar ventaja de la máquina multi-CPU y esperar lo mejor con la programación.

No puedo hacer que funcione para la vida de mí. Sólo 1 solo caso puede aceptar conexiones, todos los otros simplemente lanzan una excepción en el manejo de la conexión, 'no se puede iterar a través vacío'.

¿ésta es factible? Revisé mucho, pero no pude encontrar CUALQUIER código para bifurcar asyncore despachadores (grito)

Gracias!

Actualización 1: (rastreo completo conforme a lo solicitado)

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])

Siempre que ocurre en aceptar, sin tener en cuenta si el tenedor antes asyncore.loop, etc.

Actualización 2: (fuente completo) pastebined fuente

¿Fue útil?

Solución

Debe utilizar código de marcado para el rastreo, de lo contrario se visualiza ensuciado y no vemos tipo de excepción.

Sin embargo, creo que se TypeError: 'NoneType' object is not iterable desde self.accept() puede volver None. La razón es que varios procesos pueden conseguir leer evento para escuchar zócalo, pero sólo uno puede aceptarlo. Los procesos de descanso tendrán error EWOULDBLOCK que se captura, pero luego se devuelve None en lugar de par conexión de dirección.

Cambiar su handle_accept() para volver inmediatamente cuando accept() vuelve None.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top