![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| bvn13 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 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) и.... обламывается. Да. Именно обламывается, выдавая мне (на данный момент) ошибку:
Есть тут люди, знающие что-либо по данной проблеме? Что мне дальше можно предпринять? Можно, конечно, поменять местами потоки: в одном потоке будет выполняться то, что сейчас в методе start делается, а этот метод (он есть главный thread MAIN) будет сохранять в БД... но, может, есть другой путь решения проблемы? Это сообщение отредактировал(а) bvn13 - 14.2.2012, 21:25 |
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 14 Всего: 17 |
Очень много слов, но очень мало кода) А шанс что-то подсказать зависит от последнего)
PS: передача вместо (сериализованных) данных кода для eval'a ... что-то тут не так. |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 22 Всего: 39 |
Рассмотрите отказ от использования потоков.
Вы писали, что используете Mojo::UserAgent. Он умеет обрабатывать множество запросов параллельно, так что потоки скорее всего вам не нужны. |
|||
|
||||
| bvn13 |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 26.5.2009 Репутация: нет Всего: нет |
Не, с потоками все ок. Вопрос уже не в них. Сейчас вопрос именно в том, почему не происходит каскадного сохранения в БД? немного кода. Вот так выглядит создание каскадного объекта Розы:
Это все изначально конкатенируется в строке. А потом строка:
после этого делаю:
и получаю описанную ошибку. Какой код еще поможет помочь в определении проблемы? |
||||||||
|
|||||||||
| bvn13 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 74 Регистрация: 26.5.2009 Репутация: нет Всего: нет |
странно, выполняю этот же скрипт на другом компьютере - получаю другую ошибку...
так, только что пришла мысль, почему ЭТА ошибка может возникать... надо проверить... |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |