Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог EasyDBI 
:(
    Опции темы
shamber
Дата 18.4.2008, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



Доброго времени суток. 
Вот возник вопрос - задача.

Похожая тема проскакивала тут но ответа небыло никакого smile

Пишу прогу c использованием wxPerl. Скрипт под Windows.
Прога активно работает с БД. И когда происходит считывание данных или загрузка в БД часто интерфейс "подвисает".
Появилась мысль, может если запустить отдельный тред или процесс, который будет обрабатывать запросы от/к бд, то может избавлюсь от тормозов?
Внимание вопрос, как организовать взаимодействие с этим отдельным процессом?
Я смутно догадываюсь, что стоит использовать threads или fork, но на чем лучше остановиться?
И самое главное возможно ли добиться функционала EasyDBI: после отработки запроса вызывать 
определенный метод из определенного package?




PM MAIL Jabber   Вверх
KSURi
Дата 18.4.2008, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Сложно сказать не видя самого скрипта и его структуры.
Однако, попробую предложить вариант запуска запросов через threads c последующим вызовом "определенных методов из определенного package".

Писал прямо в форум, так что на работоспособность даже не претендует.
Код

#...

my $dbh = DBHandler->connect;

#...

sub SendDbQueryViaThreads {
 my $query = shift;
 my $res = threads->create(\&DBHandler::do, $dbh, $query)->join;
 if($res eq 'bla1') { CustomHandler->method1 }
 elsif($res eq 'bla2') { CustomHandler->method2 }
 #...
}



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
shamber
Дата 18.4.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



KSURi, правильно поправил я выразился совершенно не ясно.
Объясняю более обстоятельно.

когда человек делает запрос к EasyDBI,
что-то типа этого
Код


    $kernel->post( 'EasyDBI',
        quote => {
#отправляем sql запрос
                sql => 'foo$*@%%sdkf"""',
#результат хотим в эту "сессию"
         session => 'ret',
#вот этот метод
          method =>test,
               
        }
    );


когда EasyDBI отработает она передаст результат в сессию ret и вызовет метод test.

кроме того есть стойкое желание иметь доступ к этому DBI thread из любого пакета входящего в состав программы.

Я не могу понять как можно создать процесс\поток в который можно будет передавать данные куда нужно вернуть данные, 

что-то типа ссылки на пакет и метод, но ведь blessed структуры нельзя расшарить для thread?

кроме того ведь если делать ->join, то не будет "паралельности", нужно будет все равно ждать пока thread отработает или я не прав?
а ждать не хочется, так как в этом случае "подвисает" интерфейс.


PM MAIL Jabber   Вверх
tolkien
Дата 19.4.2008, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Межпроцессорное взаимодействие сделайте с помощью сокетов. Работать будет везде.

Если ваш скрипт будет работать под Windows. то не используйте fork. Он очень плохо под виндус работает. Лучше использовать winapi. Ну, а в Unix fork. 

###Unix
my $pid = fork;
die  "DEBUG fork can't create child process" unless (defined($pid));

if ($pid == 0)
{
    exec ("perl -w script.pl") or die "can't exec script.pl"; 
}

###Windows
use Win32::Process;
$appname = 'F:/perl/bin/perl.exe';

Win32::Process::Create($ProcessObj, $appname,
  "perl -w script.pl.pl",
      0,
      NORMAL_PRIORITY_CLASS,
      ".")|| die ErrorReport();

sub ErrorReport{
        print Win32::FormatMessage( Win32::GetLastError() );
}
PM MAIL   Вверх
Ramirez
Дата 21.4.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

Репутация: 4
Всего: 5



В POE это делается через Wheel::Run.  EasyDBI  тоже кажется так работает.
Можно запустить любой процесс или свой скрипт (который например под POE не хочется переписывать) отдельным подпроцессом в системе, при этом ядро POE сохранит с ним связь через стандартный воод/вывод....
PM ICQ   Вверх
JUmPER
Дата 22.4.2008, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 22.8.2006

Репутация: нет
Всего: 3



не советую использовать перловые потоки: они не очень дружат с XS модулями
// кстати, на виндах форк тоже через потоки работает...
--------------------
Существует 10 типов людей: те, которые понимают двоичную систему, и те, которые ее не понимаютСуществует 10 типов людей: те, кто понимают троичную систему, те, кто ее не понимают и те, кто путает ее с двоичной
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0676 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.