Многопоточни и асинхронни сокети в python

Аз съм съвсем нов в python нишки/мрежово програмиране, но имам задача, включваща и двете по-горе. Едно от изискванията на заданието е, че за всяка нова заявка създавам нова нишка, но трябва да изпращам и получавам едновременно към браузъра. В момента използвам asyncore библиотеката в Python, за да хвана всяка заявка, но както казах, трябва да създам нишка за всяка заявка и се чудех дали използването както на нишката, така и на асинхронната е излишно, или правилният начин за направи го? Всеки съвет ще бъде оценен. Благодаря

РЕДАКТИРАНЕ: Пиша прокси сървър и не съм сигурен дали клиентът ми е постоянен. Моят клиент е моят браузър (използвам firefox за по-лесно) Изглежда се свързва отново за всяка заявка. Проблемът ми е, че ако отворя раздел с http://www.google.com в него и http://www.stackoverflow.com в него получавам само една заявка наведнъж от всеки раздел, вместо множество заявки от google и от СО.


person maccard    schedule 21.03.2012    source източник
comment
Заглавието на това звучи като лоша шега. Ако наистина решите, че не можете да разрешите този проблем по друг начин, проверете библиотека за работа в мрежа като Twisted, за да се опитате да добавите малко разум.   -  person Collin Green    schedule 21.03.2012
comment
Не мога да използвам twisted, тъй като го прави за мен. Аз самият се нуждая от код повече от това   -  person maccard    schedule 21.03.2012
comment

през последните три часа се опитвах да създам проста кръгова диаграма с добавка invient-charts във vaadin. Четох много за това и сложих jquery.js и highcharts.js във файл с уеб съдържание. Модифицирах моя xml файл, за да препратка към сервлета на моето приложение. Но пак не става. Мисля, че и аз правя тези неща погрешно. Сега ме подлудява. Може ли някой да ми предостави прост урок за създаване на кръгова диаграма или друг пример за диаграма?

  -  person Collin Green    schedule 21.03.2012
comment
Да, съжалявам за това, промених се сега!   -  person maccard    schedule 21.03.2012


Отговори (1)


Отговорих на въпрос, който звучи удивително подобно на вашия, където някой имаше домашна задача да създаде настройка на клиентски сървър, като всяка връзка се обработва в нова нишка: https://stackoverflow.com/a/9522339/496445

Общата идея е, че имате цикъл на главния сървър, който постоянно търси нова връзка, която да влезе. Когато това стане, вие я предавате на нишка, която след това ще извърши собствен мониторинг за нова комуникация.

Допълнителна информация за asyncore срещу threading

От asyncore документи:

Има само два начина една програма на един процесор да прави „повече от едно нещо наведнъж“. Многонишковото програмиране е най-простият и популярен начин да го направите, но има и друга много различна техника, която ви позволява да имате почти всички предимства на многонишковото програмиране, без всъщност да използвате множество нишки. Наистина е практично само ако вашата програма е до голяма степен обвързана с I/O. Ако вашата програма е обвързана с процесора, тогава предварително планираните нишки вероятно са това, от което наистина се нуждаете. Мрежовите сървъри обаче рядко са обвързани с процесора.

Както подсказва този цитат, използването на asyncore и нишката трябва да бъдат в по-голямата си част взаимно изключващи се опции. Връзката ми по-горе е пример за подхода за нишки, при който цикълът на сървъра (или в отделна нишка, или в основната) извършва блокиращо повикване, за да приеме нов клиент. И когато получи такъв, той създава нишка, която след това ще продължи да обработва комуникацията и сървърът отново се връща към блокиращо повикване.

В модела на използване на asyncore вместо това бихте използвали неговия async цикъл, който на свой ред ще извика вашите собствени регистрирани обратни извиквания за различни дейности, които се случват. Тук няма нишки, а по-скоро проучване на всички отворени манипулатори на файлове за активност. Усещате, че правите всички неща едновременно, но под капака всичко се планира последователно.

person jdi    schedule 21.03.2012
comment
Не точно това, което търсех, но все пак реши проблема ми. - person maccard; 27.03.2012
comment
Радвам се, че поне помогна за решаването на вашия проблем. Не мислех, че това е точно решение 1 към 1 за вас, но го видях като доста пълен пример за правене на клиент/сървър сокети с нишка, стартирана за всяка нова клиентска връзка. - person jdi; 27.03.2012
comment
Преди бях правил клиент-сървър, но това раждаше нова нишка за всяка заявка на браузъра. Всъщност, независимо от въпроса, как да ускоря опашката на заявките от браузъра, тъй като изглежда, че зарежда само една заявка от всеки раздел наведнъж.... например, ако заредя google в един раздел и SO в друг, получавам две заявки наведнъж, но никога 4 или 5 от google наведнъж и 4 или 5 от SO едновременно.. - person maccard; 27.03.2012
comment
До този момент не бях сигурен какъв тип сървър изобщо създавате. Вашият клиент постоянна връзка ли е? Свързва ли се отново за всяка заявка, като по този начин се получава връзка == заявка? Ако вашият раздел с google създава само една клиентска връзка към сървъра, тогава той има само една тръба и всички заявки трябва да преминават последователно. От страна на сървъра, той може да бъде настроен да работи върху всяко read() от клиента серийно или отново да се създаде в нишка с прочетените данни. Все още трябва да правите read() един по един очевидно. - person jdi; 27.03.2012
comment
Редактирах въпроса, за да се опитам да изясня какво питам. - person maccard; 28.03.2012
comment
Когато казвате, че получавате само едно по едно, получавате ли само едно изискване от всеки раздел и това е? Или искате да кажете, че те се движат напред-назад и в крайна сметка получавате множество заявки? Ако настройвате браузъра да използва вашия сървър като прокси, тогава зависи от браузъра как ще издава заявките. - person jdi; 28.03.2012
comment