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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Rose::DB, threads - проблемы, Запись в БД в отдельном потоке 
:(
    Опции темы
bvn13
Дата 14.2.2012, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Немного предыстории можно прочитать туттут и тут

Теперь опишу свою проблему по-русски.

У меня есть задача: распарсить сайт вдоль и поперек, запихнув все содержимое в БД. Сайт писан на asp.net, постоянно выдает страницу ошибки вместо контента... в общем, начинал я простого однопоточного "прочитал, распарсил, записал в БД". Потом решил немного прооптимизировать... и... сейчас версия моего скрипта уже 0.3.1, это я еще не слежу за версиями. 

Что-то я отвлекся от темы...

По сути. 

У меня сейчас:
1) класс основной работы (качает, парсит, пишет в БД)
2) несколько классов - Rose:: DB::Object, описывающих структуру БД (в текущем релизе - не АВТОиициализация. Все вручную)

В классе основной работы реализован метод start, который проверяет доступность сайта, собирает первичную инфу для дальнейших POST-запросов к сайту. В этом методе создаются порядка 28 потоков, каждый из которых ответственнен за свою "территорию" сайта. Каждый поток методом GET- и POST-запросов собирает инфу, парсит ее, готовит шаблоны (о них ниже) объектов Розы для последующей записи, которые благополучно складываются в Thread::Queue.
Также, самым первым создается отдельный поток, который должен отвечать за сохранение подготовленных данных в виде объектов Розы в БД. Данные берутся из Thread::Queue в виде скалярных переменных, содержащих текст кода, который, будучи запущенным через eval, инициализирует переменную $obj (я хочу использовать каскадное сохранение Розы). После всего этого данный поток вызывает $obj->save(cascade => 1) и.... обламывается. Да. Именно обламывается, выдавая мне (на данный момент) ошибку:

Код

Thread 1 terminated abnormally: insert() - Cannot bind a reference
 at lib/Loader.pm line 261 thread 1
 at lib/Loader.pm line 261 thread 1


Есть тут люди, знающие что-либо по данной проблеме?
Что мне дальше можно предпринять?
Можно, конечно, поменять местами потоки: в одном потоке будет выполняться то, что сейчас в методе start делается, а этот метод (он есть главный thread MAIN) будет сохранять в БД... но, может, есть другой путь решения проблемы?

Это сообщение отредактировал(а) bvn13 - 14.2.2012, 21:25
PM MAIL   Вверх
DurRandir
Дата 15.2.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Очень много слов, но очень мало кода) А шанс что-то подсказать зависит от последнего) 
PS: передача вместо (сериализованных) данных кода для eval'a ... что-то тут не так.
PM   Вверх
Pfailed
Дата 15.2.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Рассмотрите отказ от использования потоков.
Вы писали, что используете Mojo::UserAgent. Он умеет обрабатывать множество запросов параллельно, так что потоки скорее всего вам не нужны.


--------------------
PM MAIL   Вверх
bvn13
Дата 15.2.2012, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Pfailed @ 15.2.2012,  17:46)
Рассмотрите отказ от использования потоков.
Вы писали, что используете Mojo::UserAgent. Он умеет обрабатывать множество запросов параллельно, так что потоки скорее всего вам не нужны.

Не, с потоками все ок. Вопрос уже не в них.
Сейчас вопрос именно в том, почему не происходит каскадного сохранения в БД?

немного кода.
Вот так выглядит создание каскадного объекта Розы:
Код

$VAR1 = "\$obj = 
                MedicinesInfo->new(
                    medicine                => Medicines->new(
                        link                => Links->new(
                            link    => '/DescrDrug.aspx?ID=143',
                            label   => 'H-B-\x{412}\x{410}\x{41a}C II (H-B-VAX II). \x{41e}\x{43f}\x{438}\x{441}\x{430}\x{43d}\x{438}\x{435} \x{43b}\x{435}\x{43a}\x{430}\x{440}\x{441}\x{442}\x{432}\x{435}\x{43d}\x{43d}\x{43e}\x{433}\x{43e} \x{43f}\x{440}\x{435}\x{43f}\x{430}\x{440}\x{430}\x{442}\x{430}.'
                        ),
                        name                => 'H-B-\x{412}\x{410}\x{41a}C II (H-B-VAX II)',
                        atx_codes           => 'J07BC01',
                        cfg                 => '\x{412}\x{430}\x{43a}\x{446}\x{438}\x{43d}\x{430} \x{434}\x{43b}\x{44f} \x{43f}\x{440}\x{43e}\x{444}\x{438}\x{43b}\x{430}\x{43a}\x{442}\x{438}\x{43a}\x{438} \x{433}\x{435}\x{43f}\x{430}\x{442}\x{438}\x{442}\x{430} \x{412}',
                        regcertowner        => RegCertOwners->new(
                            name => 'MERCK SHARP & DOHME B.V. (\x{41d}\x{438}\x{434}\x{435}\x{440}\x{43b}\x{430}\x{43d}\x{434}\x{44b})',
                            link => Links->new(
                                link    => '/DescrComp.aspx?ID=11',
                                label   => 'MERCK SHARP & DOHME B.V. (\x{41d}\x{438}\x{434}\x{435}\x{440}\x{43b}\x{430}\x{43d}\x{434}\x{44b})'
                            )
                        ),
                        regnum              => '\x{41f} N012982/01-2001',
                        regdate             => '2001-05-23',
                        form_structure_pack => '<p><i><b>\x{d0}\x{a1}\x{d1}\x{83}\x{d1}\x{81}\x{d0}\x{bf}\x{d0}\x{b5}\x{d0}\x{bd}\x{d0}\x{b7}\x{d0}\x{b8}\x{d1}\x{8f} \x{d0}\x{b4}\x{d0}\x{bb}\x{d1}\x{8f} \x{d0}\x{b8}\x{d0}\x{bd}\x{d1}\x{8a}\x{d0}\x{b5}\x{d0}\x{ba}\x{d1}\x{86}\x{d0}\x{b8}\x{d0}\x{b9}</b></i> \x{d0}\x{b4}\x{d0}\x{bb}\x{d1}\x{8f} \x{d0}\x{b2}\x{d0}\x{b7}\x{d1}\x{80}\x{d0}\x{be}\x{d1}\x{81}\x{d0}\x{bb}\x{d1}\x{8b}\x{d1}\x{85} \x{d0}\x{b2} \x{d0}\x{b2}\x{d0}\x{b8}\x{d0}\x{b4}\x{d0}\x{b5} \x{d0}\x{bf}\x{d0}\x{be}\x{d0}\x{bb}\x{d1}\x{83}\x{d0}\x{bf}\x{d1}\x{80}\x{d0}\x{be}\x{d0}\x{b7}\x{d1}\x{80}\x{d0}\x{b0}\x{d1}\x{87}\x{d0}\x{bd}\x{d0}\x{be}\x{d0}\x{b9} \x{d0}\x{b6}\x{d0}\x{b8}\x{d0}\x{b4}\x{d0}\x{ba}\x{d0}\x{be}\x{d1}\x{81}\x{d1}\x{82}\x{d0}\x{b8} \x{d0}\x{b1}\x{d0}\x{b5}\x{d0}\x{bb}\x{d0}\x{be}\x{d0}\x{b2}\x{d0}\x{b0}\x{d1}\x{82}\x{d0}\x{be}\x{d0}\x{b3}\x{d0}\x{be} \x{d0}\x{be}\x{d1}\x{82}\x{d1}\x{82}\x{d0}\x{b5}\x{d0}\x{bd}\x{d0}\x{ba}\x{d0}\x{b0}.</p>
<table border=\"1\" width=\"100%\">
<tr>
<td></td>
<td><b>1 \x{d0}\x{bc}\x{d0}\x{bb} (1 \x{d0}\x{b4}\x{d0}\x{be}\x{d0}\x{b7}\x{d0}\x{b0})</b></td></tr>
<tr>
<td>\x{d1}\x{80}\x{d0}\x{b5}\x{d0}\x{ba}\x{d0}\x{be}\x{d0}\x{bc}\x{d0}\x{b1}\x{d0}\x{b8}\x{d0}\x{bd}\x{d0}\x{b0}\x{d0}\x{bd}\x{d1}\x{82}\x{d0}\x{bd}\x{d1}\x{8b}\x{d0}\x{b9} \x{d0}\x{bf}\x{d0}\x{be}\x{d0}\x{b2}\x{d0}\x{b5}\x{d1}\x{80}\x{d1}\x{85}\x{d0}\x{bd}\x{d0}\x{be}\x{d1}\x{81}\x{d1}\x{82}\x{d0}\x{bd}\x{d1}\x{8b}\x{d0}\x{b9} \x{d0}\x{b0}\x{d0}\x{bd}\x{d1}\x{82}\x{d0}\x{b8}\x{d0}\x{b3}\x{d0}\x{b5}\x{d0}\x{bd} \x{d0}\x{b2}\x{d0}\x{b8}\x{d1}\x{80}\x{d1}\x{83}\x{d1}\x{81}\x{d0}\x{b0} \x{d0}\x{b3}\x{d0}\x{b5}\x{d0}\x{bf}\x{d0}\x{b0}\x{d1}\x{82}\x{d0}\x{b8}\x{d1}\x{82}\x{d0}\x{b0} B</td>
<td>10 \x{d0}\x{bc}\x{d0}\x{ba}\x{d0}\x{b3}</td></tr></table>
<p><i>\x{d0}\x{92}\x{d1}\x{81}\x{d0}\x{bf}\x{d0}\x{be}\x{d0}\x{bc}\x{d0}\x{be}\x{d0}\x{b3}\x{d0}\x{b0}\x{d1}\x{82}\x{d0}\x{b5}\x{d0}\x{bb}\x{d1}\x{8c}\x{d0}\x{bd}\x{d1}\x{8b}\x{d0}\x{b5} \x{d0}\x{b2}\x{d0}\x{b5}\x{d1}\x{89}\x{d0}\x{b5}\x{d1}\x{81}\x{d1}\x{82}\x{d0}\x{b2}\x{d0}\x{b0}: </i> \x{d0}\x{b2} 1 \x{d0}\x{bc}\x{d0}\x{bb} \x{d0}\x{ba}\x{d0}\x{b0}\x{d0}\x{b6}\x{d0}\x{b4}\x{d0}\x{be}\x{d0}\x{b9} \x{d1}\x{84}\x{d0}\x{be}\x{d1}\x{80}\x{d0}\x{bc}\x{d1}\x{8b} \x{d0}\x{b2}\x{d0}\x{b0}\x{d0}\x{ba}\x{d1}\x{86}\x{d0}\x{b8}\x{d0}\x{bd}\x{d1}\x{8b} HBsAg \x{d0}\x{b0}\x{d0}\x{b4}\x{d1}\x{81}\x{d0}\x{be}\x{d1}\x{80}\x{d0}\x{b1}\x{d0}\x{b8}\x{d1}\x{80}\x{d0}\x{be}\x{d0}\x{b2}\x{d0}\x{b0}\x{d0}\x{bd} \x{d0}\x{bd}\x{d0}\x{b0} 0.5 \x{d0}\x{bc}\x{d0}\x{b3} \x{d0}\x{b0}\x{d0}\x{bb}\x{d1}\x{8e}\x{d0}\x{bc}\x{d0}\x{b8}\x{d0}\x{bd}\x{d0}\x{b8}\x{d1}\x{8f} (\x{d0}\x{b2} \x{d0}\x{b2}\x{d0}\x{b8}\x{d0}\x{b4}\x{d0}\x{b5} \x{d0}\x{b0}\x{d0}\x{bc}\x{d0}\x{be}\x{d1}\x{80}\x{d1}\x{84}\x{d0}\x{bd}\x{d0}\x{be}\x{d0}\x{b3}\x{d0}\x{be} \x{d0}\x{b0}\x{d0}\x{bb}\x{d1}\x{8e}\x{d0}\x{bc}\x{d0}\x{b8}\x{d0}\x{bd}\x{d0}\x{b8}\x{d1}\x{8f} \x{d0}\x{b3}\x{d0}\x{b8}\x{d0}\x{b4}\x{d1}\x{80}\x{d0}\x{be}\x{d0}\x{ba}\x{d1}\x{81}\x{d0}\x{b8}\x{d1}\x{84}\x{d0}\x{be}\x{d1}\x{81}\x{d1}\x{84}\x{d0}\x{b0}\x{d1}\x{82}\x{d1}\x{81}\x{d1}\x{83}\x{d0}\x{bb}\x{d1}\x{8c}\x{d1}\x{84}\x{d0}\x{b0}\x{d1}\x{82}\x{d0}\x{b0}).<br />\x{d0}\x{92}\x{d0}\x{b0}\x{d0}\x{ba}\x{d1}\x{86}\x{d0}\x{b8}\x{d0}\x{bd}\x{d0}\x{b0} <i>\x{d0}\x{bd}\x{d0}\x{b5} \x{d1}\x{81}\x{d0}\x{be}\x{d0}\x{b4}\x{d0}\x{b5}\x{d1}\x{80}\x{d0}\x{b6}\x{d0}\x{b8}\x{d1}\x{82}</i> \x{d1}\x{87}\x{d0}\x{b5}\x{d0}\x{bb}\x{d0}\x{be}\x{d0}\x{b2}\x{d0}\x{b5}\x{d1}\x{87}\x{d0}\x{b5}\x{d1}\x{81}\x{d0}\x{ba}\x{d1}\x{83}\x{d1}\x{8e} \x{d0}\x{ba}\x{d1}\x{80}\x{d0}\x{be}\x{d0}\x{b2}\x{d1}\x{8c} \x{d0}\x{b8}\x{d0}\x{bb}\x{d0}\x{b8} \x{d0}\x{b5}\x{d0}\x{b5} \x{d0}\x{bf}\x{d1}\x{80}\x{d0}\x{be}\x{d0}\x{b4}\x{d1}\x{83}\x{d0}\x{ba}\x{d1}\x{82}\x{d1}\x{8b}.</p>
<p>1 \x{d0}\x{b4}\x{d0}\x{be}\x{d0}\x{b7}\x{d0}\x{b0}, 1 \x{d0}\x{bc}\x{d0}\x{bb} - \x{d1}\x{84}\x{d0}\x{bb}\x{d0}\x{b0}\x{d0}\x{ba}\x{d0}\x{be}\x{d0}\x{bd}\x{d1}\x{8b} (1) - \x{d0}\x{bf}\x{d0}\x{b0}\x{d1}\x{87}\x{d0}\x{ba}\x{d0}\x{b8} \x{d0}\x{ba}\x{d0}\x{b0}\x{d1}\x{80}\x{d1}\x{82}\x{d0}\x{be}\x{d0}\x{bd}\x{d0}\x{bd}\x{d1}\x{8b}\x{d0}\x{b5}.<br />1 \x{d0}\x{b4}\x{d0}\x{be}\x{d0}\x{b7}\x{d0}\x{b0}, 1 \x{d0}\x{bc}\x{d0}\x{bb} - \x{d1}\x{84}\x{d0}\x{bb}\x{d0}\x{b0}\x{d0}\x{ba}\x{d0}\x{be}\x{d0}\x{bd}\x{d1}\x{8b} (10) - \x{d0}\x{bf}\x{d0}\x{b0}\x{d1}\x{87}\x{d0}\x{ba}\x{d0}\x{b8} \x{d0}\x{ba}\x{d0}\x{b0}\x{d1}\x{80}\x{d1}\x{82}\x{d0}\x{be}\x{d0}\x{bd}\x{d0}\x{bd}\x{d1}\x{8b}\x{d0}\x{b5}.</p>'
                    ),
                    mnn                     => 'hepatitis B vaccine (rDNA) (\x{432}\x{430}\x{43a}\x{446}\x{438}\x{43d}\x{430} \x{43f}\x{440}\x{43e}\x{442}\x{438}\x{432} \x{433}\x{435}\x{43f}\x{430}\x{442}\x{438}\x{442}\x{430} \x{412} \x{440}\x{435}\x{43a}\x{43e}\x{43c}\x{431}\x{438}\x{43d}\x{430}\x{43d}\x{442}\x{43d}\x{430}\x{44f})',
                    is_individual            => 1,
                    link                    => Links->new(
                        link    => '/DescrDrug.aspx?ID=143',
                        label   => 'H-B-\x{412}\x{410}\x{41a}C II (H-B-VAX II). \x{41e}\x{43f}\x{438}\x{441}\x{430}\x{43d}\x{438}\x{435} \x{43b}\x{435}\x{43a}\x{430}\x{440}\x{441}\x{442}\x{432}\x{435}\x{43d}\x{43d}\x{43e}\x{433}\x{43e} \x{43f}\x{440}\x{435}\x{43f}\x{430}\x{440}\x{430}\x{442}\x{430}.'
                    ),
                    details                 => MedicinesInfoDetails->new(
                        link                    => Links->new(
                            link    => '/DescrDrug.aspx?ID=143',
                            label   => 'H-B-\x{412}\x{410}\x{41a}C II (H-B-VAX II). \x{41e}\x{43f}\x{438}\x{441}\x{430}\x{43d}\x{438}\x{435} \x{43b}\x{435}\x{43a}\x{430}\x{440}\x{441}\x{442}\x{432}\x{435}\x{43d}\x{43d}\x{43e}\x{433}\x{43e} \x{43f}\x{440}\x{435}\x{43f}\x{430}\x{440}\x{430}\x{442}\x{430}.'
                        ),
                        pharmacological_action  => '',
                        pharmakokinetics        => '',
                        indication              => '',
                        dispensing_mode         => '',
                        side_effect             => '',
                        contraindications       => '',
                        pregnancy_lactation     => '',
                        special_instructions    => '',
                        overdosage              => '',
                        medicinal_interaction   => '',
                        conditions_validity     => ''
                    )
                );
            ";


Это все изначально конкатенируется в строке. А потом строка:
Код

eval $str; #имеем объект Розы в $obj для сохранения.


после этого делаю:
Код

$obj->save(cascade => 1); 

и получаю описанную ошибку.

Какой код еще поможет помочь в определении проблемы?
PM MAIL   Вверх
bvn13
Дата 15.2.2012, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


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

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


 




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


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

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