nerezus
Апрель 26, 2008 15:21:54
Надо сделать чат.
Типа посылается команда нами - сервер принимает. И принимать команды.
Естественно сделать можно через recv(), но оно ждет приема из сокета, а вдруг нам надо в него написать в это время?
Есть вариант с асинхронными сокетами, а есть с потоками.
Что например, если просто в отдельный поток вынести recv и заносить в FIFO-буфер данные в нем?
Кто как делает?
redixin
Апрель 26, 2008 15:24:48
только асинхронные сокеты. twisted вам в помощь
j2a
Апрель 26, 2008 16:51:37
redixin
только асинхронные сокеты. twisted вам в помощь
ну или asyncore/asynchat
redixin
Апрель 26, 2008 23:58:45
j2a
ну или asyncore/asynchat
кстати да, лучше наверное это. ато я както сразу за тяжелую артилерию схватился
nerezus
Апрель 28, 2008 09:05:25
Т.е. нельзя использовать работу с сокетом из 2х потоков?
j2a
Апрель 28, 2008 09:45:22
nerezus
Т.е. нельзя использовать работу с сокетом из 2х потоков?
Ну вообще, есть три модели: prefork, threaded, async. Можешь использовать любую. (см. напр
http://softwaremaniacs.org/blog/2007/01/08/controlled-download-2/ , раздел “Медуза”)
nerezus
Апрель 28, 2008 11:00:41
j2aНу вот вопрос чисто про threaded: можно ли использовать работу с сокетом из 2х потоков? С одним сокетом.
Т.е. количество потоков = количество клиентов * 2.
Впрочем, для приложений на Питоне это не рекомендуется в любом случае из-за Global Interpreter Lock
Эм, немного не понял, в чем оно заключается.
j2a
Апрель 28, 2008 17:44:04
Андрей Светлов
Апрель 29, 2008 04:49:58
j2a
Маленькое дополнение: когда вызывается c extention он может снять GIL. Иногда этим сильно пользовался - и помогало.
socket интенсивно это юзает: посмотри в socketmodule.c на Py_BEGIN_ALLOW_THREADS
Но в общем согласен - не стоит.
Следующий вопрос: кто делает внятное объяснение prefork, threaded, async и GIL?
Или, быть может, знаешь хорошие ссылки? По prefork, threaded, async - уже есть на русском, уверен.
Не очень-то хочется писать большую статью…
ZZZ
Апрель 29, 2008 05:08:06
А было бы интересно… У меня в разработке большой сервер, где каждому клиенту отводится отдельная нить со своим сокетом. Да и эта нить не редко порождает другие… поднити. В сокет запись идёт через очередь, одной нитью.
Проблему маштабирования на несколько ядер я собрался решить запуском нескольких копий, слушающих разные порты для входящих соединений. Благо это не проблема, потому что связаны клиентские нити только СУБД.
Очень интересует вопрос быстродействия этой системы. Серьёзно протестить пока нет возможности.