2009-11-11 2 views
2

Для начала я использовал Twisted и SocketServer как с ForkMixIn, ThreadMixIn, так и с помощью рецептов «поток-пул».Python, Asyncore и forks

Однако, я хотел сделать что-то конкретное в Python.

Алюминиевый фон. Раньше я писал на C простую декану TCP, которая привязывалась бы к сокету и слушала бы его, затем пре-форк X много раз, а затем просто передавала отладку serverocket по всем видам, и все бы очень восприимчивы к клиентам.

Я проверил «выбор/опрос» на основе asyncore, который мне очень нравится. Моя единственная говядина заключалась в том, что я мог бы получить небольшой процессор, который был бы разблокирован, разворачивая несколько раз, чтобы воспользоваться машиной с несколькими процессорами и надеяться на лучшее с планированием.

Я не могу заставить его работать на жизнь меня. Только один единственный экземпляр может принимать соединения, все остальные просто бросают исключение при обработке соединения, «не могут проходить через Empty».

это возможно? Я проверил много, но я не мог найти ЛЮБОГО кода для разветвления асинхронных диспетчеров (крик)

Спасибо!

Update 1: (Full отслеживающий по запросу)

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

всегда в принять, независимо, если я вилка перед asyncore.loop и т.д.

Update 2: (полный источник)pastebined source

+0

Не могли бы вы уточнить вопрос с точным отслеживанием? –

+0

Совершено, и жаль, что не делал этого в первую очередь. Очень глупо от меня. –

+0

Также добавлен полный источник, на всякий случай у кого-то есть время и будет делать этот выстрел. Извиняюсь за то, что вы не включили все, что у него получилось. –

ответ

2

Вы должны использовать разметку кода для трассировки, в противном случае она отображается беспорядочно, и мы не видим исключения физическое воспитание

Но я считаю, это TypeError: 'NoneType' object is not iterable с self.accept() может вернуться None. Причина в том, что несколько процессов могут получать событие чтения для прослушивания сокета, но только один может принять его. Остальные процессы получат ошибку EWOULDBLOCK, которая была поймана, но затем она возвращает None вместо пары адрес-адрес.

Смените handle_accept() на возврат немедленно, когда accept() возвращает None.

+0

Вы были абсолютно правы. Попробуйте принять и вернуть на него. Спасибо! Большое спасибо моему Московскому коллеге :) –

Смежные вопросы