Форум сайта python.su
Надо сделать чат.
Типа посылается команда нами - сервер принимает. И принимать команды.
Естественно сделать можно через recv(), но оно ждет приема из сокета, а вдруг нам надо в него написать в это время?
Есть вариант с асинхронными сокетами, а есть с потоками.
Что например, если просто в отдельный поток вынести recv и заносить в FIFO-буфер данные в нем?
Кто как делает?
Офлайн
только асинхронные сокеты. twisted вам в помощь
Офлайн
redixinну или asyncore/asynchat
только асинхронные сокеты. twisted вам в помощь
Офлайн
j2aкстати да, лучше наверное это. ато я както сразу за тяжелую артилерию схватился
ну или asyncore/asynchat
Офлайн
Т.е. нельзя использовать работу с сокетом из 2х потоков?
Офлайн
nerezusНу вообще, есть три модели: prefork, threaded, async. Можешь использовать любую. (см. напр http://softwaremaniacs.org/blog/2007/01/08/controlled-download-2/ , раздел “Медуза”)
Т.е. нельзя использовать работу с сокетом из 2х потоков?
Офлайн
j2a
Ну вот вопрос чисто про threaded: можно ли использовать работу с сокетом из 2х потоков? С одним сокетом.
Т.е. количество потоков = количество клиентов * 2.
Впрочем, для приложений на Питоне это не рекомендуется в любом случае из-за Global Interpreter LockЭм, немного не понял, в чем оно заключается.
Офлайн
nerezushttp://ru.wikipedia.org/wiki/Python#.D0.93.D0.BB.D0.BE.D0.B1.D0.B0.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D0.B1.D0.BB.D0.BE.D0.BA.D0.B8.D1.80.D0.BE.D0.B2.D0.BA.D0.B0_.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D0.BF.D1.80.D0.B5.D1.82.D0.B0.D1.82.D0.BE.D1.80.D0.B0_.28GIL.29Впрочем, для приложений на Питоне это не рекомендуется в любом случае из-за Global Interpreter LockЭм, немного не понял, в чем оно заключается.
Офлайн
j2a
Маленькое дополнение: когда вызывается c extention он может снять GIL. Иногда этим сильно пользовался - и помогало.
socket интенсивно это юзает: посмотри в socketmodule.c на Py_BEGIN_ALLOW_THREADS
Но в общем согласен - не стоит.
Следующий вопрос: кто делает внятное объяснение prefork, threaded, async и GIL?
Или, быть может, знаешь хорошие ссылки? По prefork, threaded, async - уже есть на русском, уверен.
Не очень-то хочется писать большую статью…
Офлайн
А было бы интересно… У меня в разработке большой сервер, где каждому клиенту отводится отдельная нить со своим сокетом. Да и эта нить не редко порождает другие… поднити. В сокет запись идёт через очередь, одной нитью.
Проблему маштабирования на несколько ядер я собрался решить запуском нескольких копий, слушающих разные порты для входящих соединений. Благо это не проблема, потому что связаны клиентские нити только СУБД.
Очень интересует вопрос быстродействия этой системы. Серьёзно протестить пока нет возможности.
Офлайн