Найти - Пользователи
Полная версия: Сервер - структура
Начало » Network » Сервер - структура
1 2 3
nerezus
Надо сделать чат.
Типа посылается команда нами - сервер принимает. И принимать команды.

Естественно сделать можно через recv(), но оно ждет приема из сокета, а вдруг нам надо в него написать в это время?
Есть вариант с асинхронными сокетами, а есть с потоками.
Что например, если просто в отдельный поток вынести recv и заносить в FIFO-буфер данные в нем?

Кто как делает?
redixin
только асинхронные сокеты. twisted вам в помощь
j2a
redixin
только асинхронные сокеты. twisted вам в помощь
ну или asyncore/asynchat
redixin
j2a
ну или asyncore/asynchat
кстати да, лучше наверное это. ато я както сразу за тяжелую артилерию схватился
nerezus
Т.е. нельзя использовать работу с сокетом из 2х потоков?
j2a
nerezus
Т.е. нельзя использовать работу с сокетом из 2х потоков?
Ну вообще, есть три модели: prefork, threaded, async. Можешь использовать любую. (см. напр http://softwaremaniacs.org/blog/2007/01/08/controlled-download-2/ , раздел “Медуза”)
nerezus
j2a
Ну вот вопрос чисто про threaded: можно ли использовать работу с сокетом из 2х потоков? С одним сокетом.
Т.е. количество потоков = количество клиентов * 2.

Впрочем, для приложений на Питоне это не рекомендуется в любом случае из-за Global Interpreter Lock
Эм, немного не понял, в чем оно заключается.
j2a
nerezus
Впрочем, для приложений на Питоне это не рекомендуется в любом случае из-за Global Interpreter Lock
Эм, немного не понял, в чем оно заключается.
http://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
Андрей Светлов
j2a
Маленькое дополнение: когда вызывается c extention он может снять GIL. Иногда этим сильно пользовался - и помогало.
socket интенсивно это юзает: посмотри в socketmodule.c на Py_BEGIN_ALLOW_THREADS

Но в общем согласен - не стоит.

Следующий вопрос: кто делает внятное объяснение prefork, threaded, async и GIL?
Или, быть может, знаешь хорошие ссылки? По prefork, threaded, async - уже есть на русском, уверен.

Не очень-то хочется писать большую статью…
ZZZ
А было бы интересно… У меня в разработке большой сервер, где каждому клиенту отводится отдельная нить со своим сокетом. Да и эта нить не редко порождает другие… поднити. В сокет запись идёт через очередь, одной нитью.
Проблему маштабирования на несколько ядер я собрался решить запуском нескольких копий, слушающих разные порты для входящих соединений. Благо это не проблема, потому что связаны клиентские нити только СУБД.
Очень интересует вопрос быстродействия этой системы. Серьёзно протестить пока нет возможности.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB