одновременно отправлять / получать информацию с сервера, в Python? - PullRequest
2 голосов
/ 19 сентября 2011

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

Должен ли я создать многопоточный сервер?И есть поток для прослушивания данных.

А затем еще один поток для отправки информации клиенту?

Тогда для клиентской стороны мне нужно использовать потоки для отправки / получения информации?

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

Использовать асинхронный ввод-вывод.Для Python существует дюжина библиотек асинхронных IO сокетов. Здесь - краткий тест.Я также проверял gevent, eventlet, asyncore, twisted, pyev, pycurl, tornado.

  • Twsited
    является стабильным, но наиболее медленным и также не легко начать с.
  • gevent, eventlet (libevent)
    легко запустить и быстро (код выглядит как блокировка), но есть некоторые проблемы с разветвлением.
  • pycurl (libcurl)
    быстро и легко (если вы можете делать флагимагия .. но есть пример) но только http.
  • pyev (libev)
    вы должны понимать, что вы делаете, почти как опросить себя.
  • Торнадо (опрос в Python)
    достаточно быстро, и я думаю, что стабильно, а также легко начать.
  • asyncore
    очень быстро .. но неиспользуйте это .. это уродливо-уродливо.

Не используйте потоки в python, если вы действительно не знаете, что делаете.Python и потоки не очень большие друзья (если в версии 3.2 в 3.2 не должно быть нового gil).

2 голосов
/ 19 сентября 2011

На стороне сервера вам явно нужен Socket Server .Этот сервер создает новый поток для каждого входящего клиентского соединения.

Как только соединение установлено, и клиенту, и потоку, который был создан для связи, требуется дополнительный поток, если им приходится параллельно заниматься другими делами, чемпрослушивание сокета, если связь синхронная.Если вам требуется асинхронная связь, то Python предоставляет отличный Asynchronous Socket Handler .

1 голос
/ 21 сентября 2011

Вам не нужны потоки ни для клиента, ни для сервера; вместо этого вы можете выбрать () для мультиплексирования всех входов / выходов внутри одного потока.

1 голос
/ 20 сентября 2011

Используйте асинхронный сокет.Пример сервера может быть найден здесь и клиентский код здесь .Никаких прямых хлопот с потоками.В зависимости от ваших потребностей, вам, вероятно, не нужен асинхронный клиент.

...