8 сентября 2015 г., 14:52 пользователь Ilya Chesnokov
<[email protected]> написал:
> 8 сентября 2015 г., 0:03 пользователь Victor Efimov <[email protected]> 
> написал:
>> Я думаю имелось ввиду несколько другое. Примеры это DBI и CPAN Redis.
>
> Ну да. Хотя в целом про TCP keepalive тоже интересная тема.
>
>> 1) Прежде чем послать данные в сокет сделать следующее:
>>
>>   if ($self->{pid} != $$) {
>>     $self->connect;
>>   }
>>
>> (код из Redis.pm)
>>
>> 2) В DESTROY, если он есть, делать деструкцию только если $self->{pid} == $$.
>> Надо сказать, это нужно только в DBI, т.к. он в DESTROY посылает
>> какие-то данные в сокет. В "обычных" клиентах не нужно. В Redis.pm
>> нету.
>
> В-общем, ключевой вопрос в том, можно ли использовать одно и то же
> соединение в разных процессах, если я правильно понял.
> Если нельзя, то первый подход используется, если нельзя, то второй -
> не закрывать соединение в дочерних процессах, а только в родительском.

По-моему одно и то же соединение в любом случае использовать нельзя.
Учитывая что сценарий -
это fork() про который мы не знаем зачем и почему он. Возможно до
fork() кто-то использовал соединение, после fork()
собирается использовать и в child и parent. В таком случае и child и
parent будут писать в один сокет. Это всё равно что они по-очереди
будут писать в сокет в одном процессе.

А DESTROY в DBI имхо просто для того чтобы закрыть коннект, чтобы у
mysql сервера не висели открытые коннекты

>
>> 3) реконнект
>>
>> 8 сентября 2015 г., 5:36 пользователь Eugen Konkov <[email protected]> 
>> написал:
>>> Здравствуйте, Ilya.
>>>
>>> IC> Есть ли готовые модули для поддержания постоянного соединения с
>>> IC> каким-либо сервером?
>>> Обычное TCP соединение с keep-alive пакетами
>>> http://habrahabr.ru/company/intersystems/blog/155565/
>>> http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
>>>
>>>>не закрывалось при уничтожении форка
>>> Делаете управление соединениями в мастер процессе. Создали соединение или 
>>> их pool и отдаёте fork'ам хендлы. Если будет один хендл, То нужно будер 
>>> решить проблему, какому форку передавать пришедший ответ (Думаю будет проще 
>>> если создавать хендл/fork)
>>>
>>> Вы писали 7 сентября 2015 г., 12:18:21:
>>>
>>> IC> Добрый день.
>>>
>>> IC> Есть ли готовые модули для поддержания постоянного соединения с
>>> IC> каким-либо сервером? Нужно для того, например, чтобы инициализировать
>>> IC> соединение при старте веб-приложения и повторно использовать в форках,
>>> IC> при этом чтобы оно не закрывалось при уничтожении форка, ну и заново
>>> IC> соединялось при необходимости.
>>>
>>> IC> В-общем, нужно что-то вроде той части DBI, которая отвечает за
>>> IC> TCP-соединение, но без всего того, что связано непосредственно с
>>> IC> базами данных.
>>>
>>> IC> Да, и еще интересно, есть ли что-то подобное отдельно для 
>>> AnyEvent::Handle.
>>>
>>> IC> --
>>> IC> Best regards,
>>> IC> Ilya Chesnokov
>>>
>>>
>>>
>>> --
>>> С уважением,
>>>  Eugen                          mailto:[email protected]
>>>
>>> --
>>> Moscow.pm mailing list
>>> [email protected] | http://moscow.pm.org
>
>
>
> --
> Best regards,
> Ilya Chesnokov
-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить