Python, Asyncore e Forks
Pergunta
Apenas para iniciantes, usei Twisted e SocketServer com o ForkMixin, Threadmixin e experimentei as recepies "Thread-Pool".
No entanto, eu queria fazer algo em particular trabalho em Python.
Um pouco de fundo. Anteriormente, escrevi em C um simples TCP Deamon que se vinculou a um soquete e ouvia nele, depois pré-Fork x muitas vezes e depois passava o servidorsocket descendente para todos os garfos e todos aceitavam muito o casamento.
Eu verifiquei o assíncolo "Select/Poll", que eu gosto muito. Minha única carne foi que eu conseguia um pouco de CPU não me acariciando algumas vezes para tirar proveito da máquina multi-CPU e esperar o melhor com a programação.
Eu não posso fazer funcionar para a minha vida. Apenas 1 instância única pode aceitar conexões, todos os outros simplesmente lançam uma exceção ao lidar com o Connect, 'não podem iterar isso vazio'.
Isso é ainda viável? Eu verifiquei muito, mas não consegui encontrar nenhum código para fazer despacho de assassinato (CRY)
Obrigada!
Atualização 1: (Traceback completo conforme 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])
Sempre acontece em aceitar, independentemente de eu fork antes do assíncrono.loop, etc.
Atualização 2: (fonte completa) fonte pastebinada
Solução
Você deve usar a marcação de código para Traceback, caso contrário, ele é exibido e não vemos o tipo de exceção.
Mas eu acredito que é TypeError: 'NoneType' object is not iterable
desde self.accept()
pode retornar None
. O motivo é que vários processos podem obter um evento de leitura para o soquete de escuta, mas apenas um pode aceitá -lo. Os processos de restos serão obtidos EWOULDBLOCK
erro que é capturado, mas depois retorna None
Em vez de par de endereço de conexão.
Mudar seu handle_accept()
para voltar imediatamente quando accept()
retorna None
.