AnyEvent::HTTP сохраняет коннекты для повторного использования и после
fork с ними происходит каша...
Попробуй до fork использовать AnyEvent::HTTP с параметром keepalive => 0
09.10.2013 7:26, ksvs пишет:
Есть приложение, в котором главный процесс и дочерние общаются между
собой по сокетам, используя EV модуль.
Дочерние процессы получают информацию от главного, делают HTTP
запросы, анализируют и возвращают результат главному. В дочерних
процессах запросы идут параллельно с использованием либо
Net::Curl::Multi, либо AnyEven::HTTP.
Все было отлично, пока не понадобилось в главном процессе перед fork,
сделать HTTMP запрос. LWP использовать можно, но не хочется.
Используемые варианты:
1. Делаем первый запрос при помощи AnyEven::HTTP, дочерние работают с
Curl - все отлично. Это для проверки.
2. Делаем первый запрос при помощи AnyEven::HTTP на несуществующий
адрес, дочерние работают с AnyEven::HTTP - все нормально.
3. Делаем первый запрос при помощи AnyEven::HTTP на существующий
адрес, работа AnyEven::HTTP в дочерних процессах зависает. При этом
общение между процессами идет: гонял ping для подтверждения того, что
EV не завис и система коммуникаций между процессами жива.
Может кто-то сталкивался с таким поведением AnyEven::HTTP?
Сделал максимально простой вариант для теста.
В нем с первоначальным вызовом AnyEven::HTTP, в дочернем процессе
AnyEven::HTTP, стал работать, но очень-очень медленно. Точнее все
зависит от того, как карты лягут: без первого вызова время выполнения
1,24 секунды, а с первым - может быть 21 секунд, а может быть 5 секунд.
Но ведь с Curl работает отлично. Значит дело не в EV, а в AnyEven::HTTP.
Для подтверждения этого вместо первого вызова AnyEven::HTTP, сделал
просто открытие сокета, EV::WRITE, EV::READ - все работает отлично.
AnyEven::HTTP настраивал, чтобы он закрывал все сокеты. Это перед
форком. Да и делается ведь EV::break перед форком.
Интересно понять причину этого.
--
С уважением Анатолий.
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org