2014-01-04 4 views
0

Я уже давно использую этот сокет-сервер Twisted Python TCP, и теперь он начинает меня добираться. Моя проблема в том, что у меня есть 350+ (дайте или принимайте в зависимости от дня и часа) клиентов сразу, а иногда у меня будет большой лаг. В промежутке я имею в виду иногда, когда в «комнате» (в основном это аватарный чат, у пользователей есть запасы, друзья, дома и т. Д.) С любым количеством пользователей (как правило, таких, как 10+ пользователей в комнате) 2-5 секунд «зависает» каждую минуту или около того. Замерзает, я имею в виду, что никакие пакеты не отправляются, и никто не может видеть, как кто-то перемещает их характер, разговаривает или что-то еще. После его размораживания это похоже на то, что все пакеты сразу отправляются сразу, и вы видите сообщения всех и все.Python Twisted Socket Server

Мой сокет Sever был основан от этого: https://github.com/jesstess/twisted-network-programming-essentials-examples/blob/master/Chapter11-Testing/chatserver.py

мне интересно, что я могу сделать, чтобы предотвратить задержку. Я думал о многопоточности, но как бы мне это сделать в чем-то таком, как приведенный выше пример? Большинство клиентов, которых я когда-либо имел в сети, были 451 несколько недель назад, но я не думаю, что это произойдет в ближайшее время.

Если вы смущены моим вопросом - в основном я спрашиваю, как заставить сервер лучше обрабатывать ~ 350 клиентов и предотвращать задержки/замораживания для всех клиентов в комнате.

Edit: В отличие от этого примера, я добавил это в нижней части:

ServerCL = GameServer(sys.argv[1]) 
reactor.listenTCP(int(config.get('GameServer1_' + str(sys.argv[1]), 'port')), ServerCL) 
reactor.listenTCP(int(config.get('GameServer2_' + str(sys.argv[1]), 'port')), ServerCL) 
reactor.run() 
+0

Я верю, что twisted уже * многопоточен под капотом, поэтому я не уверен, что вы получите много от этого (пожалуйста, не стесняйтесь проверить ... прошло некоторое время с тех пор, как я играл с ним). Изоляция «почему» это медленный, безусловно, правильный подход ... – FuzzyBunnySlippers

+2

скрученный не является резьбовым, а основан на событии. Это означает, что все работает в одном потоке, и если обработчик событий блокирует или занимает слишком много времени, все соединения будут страдать. –

+0

Возможно ли, что, возможно, использование Twisted в качестве базы серверов сокетов сделает лучше? Может быть, с помощью обычного сокета lib? – 67898g8

ответ

2

Эти «замерзает» может происходить по разным причинам. Скорее всего, это не что-то в Twisted, но что-то в вашем приложении, которое занимает 2-5 секунд и не позволяет серверу ничего делать.

Похоже, у вас есть большое сложное приложение, поэтому вместо того, чтобы угадывать, что это может быть, я предлагаю вам использовать инструмент, например twisted_hang, чтобы определить, где ваше приложение застревает; это должно дать вам некоторое представление о том, что вы можете изменить.

+0

Спасибо! Я обязательно посмотрю на это и попробую. – 67898g8

+0

Просто интересно, но вы когда-нибудь использовали его раньше? Я использую его сейчас, и я получаю тонну вывода таких вещей, как это: [image] (http://i.imgur.com/y9COLES.png). Я использую по умолчанию они имеют в своем GitHub: \t \t 'наблюдател = HangWatcher (0.1, 0.5) \t \t watcher.start()' – 67898g8

+0

Кто-нибудь есть какие-нибудь идеи? .. – 67898g8