Очень любопытно. Я раньше слышал про эту фичу, но как-то руки и глаза не доходили документацию прочитать. Кажется, я уже даже знаю, где это можно применить, так что, спасибо.
Есть. pg_send_query и другие функции для асинхронных запросов. Правда, глубинное понимание того, как они работают, приходит, скорее, не после чтения мануала, но на собственном опыте. Впрочем, иногда оно того стоит
ну это другой подход опять же… тут объясняется про схему:
отправили запрос
делаем какие либо действия не трубующие результата этого (или этих если им много) запроса
когда понадобился результат: получаем ответ
обрабатываем ответ
Результат тот же, только многим людям понятнее чем callback'и
(Я не против callback'ов! В javascript их очень неплохо реализую и люблю использовать, программа симпатичней и логичнее получается, но это не для всех)
Просто тут другая парадигма.
В первую очередь стоит обратить внимание на AnyEvent::DBI. Правильно было написано выше что смысл асинхронности в вызове коллбэка, а не проверок в стиле «Ну что готово?» "-Нет" «Так, а сейчас может быть готово?».
AnyEvent::DBI создаёт ещё один поток. По своему опыту могу сказать — в Perl с потоками лучше не работать, если не хотите искать, почему ваша программа умерла с segmentation fault…
ага. Создавать по процессу на соединение тоже не очень:
The overhead for very simple statements («select 0») is somewhere around 120% to 200% (dual/single core CPU) compared to an explicit prepare_cached/execute/fetchrow_arrayref/finish combination.
Вся проблема в том, что DBI не умеет работать асинхронно. Иногда можно забить на DBI и опустить на уровень DBD::Pg
Секунду, а причем тут процесс на соединение? Что вам мешает использовать один и тот же $dbh? Я понимаю что это решение не подойдет для web, но автор топика (вы) и не говорил про то что это конкретная заточка под web, как я понимаю речь идет об общем асинхронном программировании баз данных в Perl.
У меня много скриптов демонов висит которые используют именно AnyEvent::DBI.
Overhead в 120-200% я считаю очень даже допустимым, тока что набросал bechmark, 10к запросов «select 1», результат:
DBI (with explicit prepare): 0.688
DBI (with prepare in loop): 1.180
AnyEvent::DBI: 2.785
Возможно иногда и можно забить. Иногда нельзя, зависит от ситуации.
Попробую, спасибо. Хотя, мне не кажеся, что это поможет.
В потоке запускается целый интерпретатор. Даже если делать отдельный пакадж, удаляя тем самым все локальные данные из контекста, все равно многовато получится. Тем не менее попробую померить.
Асинхронность в DBD::Pg