![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
Задача такова:
есть скрипт, кот. ждет подключеня от клиента (браузера). При подключении, от клиента принимается некий запрос, сервер его обрабатывает и отправляет ответ. Выяснил оптимальную схему работы (поправьте если это не так!!!): Есть основной поток, который принимает коннекты и записывает их в очередь, второй поток берет их из этой очереди последовательно и обрабатывает (взял -> обработал\ответил -> берем следующего). Набросал:
Долгими мучениями выяснилось почему происходит вылет при добавлении в очередь. Очередь со строками работает на ура. Но у $conn тип то не такой, а threads::shared не умееть шарить объекты, потому и Thread::Queue этого не умеет. Так вот, подскажите пожалуйста выход из этой ситуации. Буду очень благодарен. Опыта очень мало - новичОК я. Или вовсе порекомендуете другой подход?! ps: у меня Windows Vista + Denwer3_Base_2008-01-13_a2.2.4_p5.2.4_m5.0.45_pma2.6.1 + Denwer3_Perl_2008-01-13_5.8.8 но рабочий скрипт будет перенесен на FreeBSD Это сообщение отредактировал(а) ImSave - 5.9.2009, 18:19 |
|||
|
||||
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
может fork ?
тогда как реализовать очередь? или она не нужна.. ну посоветуйте... ![]() |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
apache ?
nginx + fastcgi ? Зачем вам самому писать web сервер ? |
|||
|
||||
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
а как тогда реализовать задачу? на FreeBSD апач Это сообщение отредактировал(а) ImSave - 6.9.2009, 13:24 |
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
под windows тоже есть WWW сервера.
|
|||
|
||||
TDrive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 6.9.2009 Репутация: нет Всего: нет |
а зачем делать очередь если это реализовано ОС
функция listen () задаёт количество подключений ожидающих в очереди. функция accept() берёт по одному подключению из очереди после чего можно например через fork() создавать процесс который будет обрабатывать подключение а основной процесс дальше слушает accept(). для примера вот сервер висит на 2000 порту читает строку из клиента и отправляет её обратно клиенту. для каждого клиента открывается свой процесс а за очередью следит ОС
|
|||
|
||||
sir_nuf_nuf |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 920 Регистрация: 6.1.2008 Репутация: 14 Всего: 31 |
TDrive, вообщем вы правы, но не стоит изобретать велосипед. Лучше имхо использовать готовые решения, если только не нет цели научиться.
TDrive, вы описали классический сервер на форках. Так, например, PostgreSQL работает - на каждое соединение отдельный процесс. А вы не в курсе как работает апач (в режиме c workerами, а не с потоками) ? Там процессы живут долго и каждый из них обслуживает более, чем одно соединение. Т.е. как я понимаю, они fork делают еще до того как делают accept, наследуют слушающий сокет, а потом все вызывают accept на нем ? так ? Или нужны дополнительные блокировки, что бы не конкурировать за него ? |
|||
|
||||
TDrive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 6.9.2009 Репутация: нет Всего: нет |
про апач сказать ничего не могу сам только начал во всём этом разбираться.
|
|||
|
||||
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
Спасибо всем, но не могли бы вы по существу мне что-нибудь подсказать...
я понятия не имею что за готовые решения. Может подскажите какие и как к ним применить мою задачу? вообще делаю по аналогии как здесь, только цель другая - не сжатие, а будет что-то вроде перенаправления, если запрос на сайт из "черного списка". и как сказал уважаемыйsir_nuf_nuf, все это для изучения ![]() |
|||
|
||||
TDrive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 6.9.2009 Репутация: нет Всего: нет |
по существу я уже сказал
коннекты и так ставятся в очередь количество очереди устанавливает listen() кстати случайно наткнулся вот статья очень полезная http://algolist.manual.ru/web/servers.php там и про апач есть если в чём ошибся ссори сам ещё разбираюсь во всём этом. есть хорошая книга "Линкольн Д. Штайн - Разработка сетевых программ на Perl" советую тем кто интересуется. пока только этим могу помочь) |
|||
|
||||
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
Спасибо, почитаем! ![]() |
|||
|
||||
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
с чего начал к тому и хочу вернутся...пробую обойтись без форков.т.к. буду реализовывать очередь с приоритетами
Это сообщение отредактировал(а) ImSave - 11.1.2010, 13:09 |
|||
|
||||
ImSave |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 4.9.2009 Репутация: нет Всего: нет |
я так понимаю в моем случае нельзя задавать св-ва объекту $connect ? или кто-то меня порадует
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |