![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| burakov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Вот пробный код с двумя потоками. Вопрос в следующем:
во все примерах про потоки - join - это чтобы родительская программа дождалась, когда дочерние потоки выполнятся. И всегда делают join на каждый запущенный поток. Я если делаю join на каждый поток, то ниже идущий поток не выполняется , поэтому поток thread_worker2 приходится запускать - детач. Это так и должно быть?? или я чего то не понимаю??
|
|||
|
||||
| DurRandir |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 335 Регистрация: 27.9.2009 Репутация: 1 Всего: 17 |
Вы хоть этот код запускали?) Он работает ровно как написано - печатает в вечном цикле 2 разные цифры. Приводите реальный код.
|
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Обычно сначала запускают все потоки, складывая их id в массив. А потом в цикле для каждого элемента массива делают join.
|
|||
|
||||
| burakov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Я Вам про то же и говорю!
Код я реально запускал - он рабочий, потому что есть всего один join на самый последний поток. Если заджойнить все потоки, то будет выполняться самый верхний заджойненный. Я и спрашиваю почему так происходит?? поскольку как и Pfailed везде в примерах видел, что join делают на все потоки! (кто массив пропускает по foreach , если потоков много - штук 50 , ну а у меня всего 2 - я их вручную заджойнил). Моя проблема в том, что выполняется первый заджойненный, а остальные нет. Тогда я Вышел из положения первому потоку дал детач, а последнему (в порядке появления в теле основной программы) сделал join и все заработало. Я и решил спросить - такое поведение потоков нормально ?? Почему в примерах join делают на каждый поток, а мне приходится делать на последний? |
|||
|
||||
| Pfailed |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 19.7.2009 Репутация: 2 Всего: 39 |
Потому что join нужно делать только после запуска всех потоков. Как в моем предыдущем сообщении
|
|||
|
||||
| burakov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Да так работает, но тогда возникает вопрос
как делать join, если количество потоков заранее неизвестно . Ну то есть допустим я хочу сделать количество потоков от 0 до 50. И каждый нужно заджойнить и неизвестно сколько потоков на данный момент времени существует... Догадываюсь что нужно сначала пройтись по всем - детач, а потом добавить новый поток и опять все заджойнить? |
|||
|
||||
| burakov |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 554 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Подскажите в таком вопросе.
Как в многопоточном грабере сделать проверку на то, что все уже сграблено? То есть грабер закончил работу? Я придумал, считать количество ссылок в таблице, куда записываю уникальные ссылки на скачивание контента, делаю в отдельном потоке sleep 10; и каждые 10 секунд проверяю количество записей в таблице ссылок, если количество в 2х проходах одинаково, значит ничего больше не добавляется и можно программу завершать, но как то мне самому такое завершение работы не очень нравится (а вдруг ссылки не добавляется, но скачка контента еще идет - допустим картинка большая). Как еще можно понять работает грабер или уже ничего не делает? Кроме того мои однопоточные граберы страдали такой болезнью - время от времени как бы подвисали, ну то есть выполняет get ($url) и все ни с места. Я так подозреваю, что сайты-доноры как то обрубают коннект по времени или еще как, а грабер висит на моменте get($url) ... Как такое дело можно отследить и убить некорректный поток? |
|||
|
||||
| JamesMorgan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 11.7.2011 Репутация: нет Всего: 1 |
timeout выставить, если ответа нету то вернуть сообщение об этом.
|
|||
|
||||
![]()
|
| Правила форума "Perl: CGI программирование" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: разработка для Web | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |