Написал многопоточный скрипт, но работает непонятно с неудачами
-
Всем привет. Изучаю многопоточность. Для этого написал скрипт. Скрипт сначала заходит в поиск пользователей ВК по определенному запросу, затем парсит ссылки на страницы пользователей с 1 страницы в файл. После этого в многопоточном режиме собирает количество друзей в файл. Вот проблема во втором этапе- при работе с многопотоком.
Ситуация следующая, когда количество неудач больше нуля, количество результатов отличается от тех, что я задал. Когда выставляю количество неудач = 0, все вроде бы четко. Проверку на ошибки поставил, ошибок вроде бы нет вообще. То есть, методом научного тыка я все сделал как хочу, теперь хочу понять что я сделал и почему так. Пробовал поиск по форуму, но что-то тяжело пробиваться через солянку тем. Буду благодарен за советы. Скрипт прилагается. Ресурсы: 2 пустых txt файла.
0_1500735482568_count-friends.xml
-
@romanbiz Молодец что сразу приложил скрипт. Но вот зря без ресурсов.
У тебя в функции parse_count_funk установлен экшен игнорировать ошибки, суть его такова, что если в нём экшен сработает с ошибкой, то !!все!! остальные в нём, пропустятся.
То есть if[[WAS_ERROR]]
надо ставить вне экшена игнорировать ошибки. Как и всё остальное, кроме загрузить.Примерно так. Проверь с ресурсами.
-
@Fox ну ошибка может не только при загрузке возникнуть насколько я знаю. Но и по ходу парсинга страницы итп.
Поправил как сказали, результат тот же.
Дано:
3 потока
3 успешных выполнения
1 неудачное использованиеПолучил 5 выполнений:
[574710937] [18:36:10] Поток №2 : поток спарсил
[574710937] [18:36:10] Поток №3 : поток спарсил
[574710937] [18:36:10] Поток №4 : поток спарсил
[574710937] [18:36:16] Поток №2 : поток спарсил
[574710937] [18:36:16] Поток №3 : поток спарсил
-
@romanbiz У тебя там ошибок ни где не будет. Кроме экшена загрузить. Я приложил скрипт в своём посте выше, в котором и сделал, что писал. Если скрипт работает не так как тебе надо, скидывай ресурс, хотя бы тестовый. И опиши, какой результат хочешь увидеть в итоге.
-
@Fox Ресурсы просто пустые файлы. 2 штуки. Они наполняются по ходу действия скрипта. А при повторном его запуске содержимое файлов если они даже они не пустые очищается в начале. Дописал это в пост.
И опиши, какой результат хочешь увидеть в итоге.
Я хочу понять почему когда переменная неудач >0, количество успешных выполнений начинает превышать заданное мною.
-
@romanbiz Если в описании ресурса снять галочку с чтение и оставить галочку запись, то скрипт будет спрашивать куда сохранить файл.
-
@Fox said in Написал многопоточный скрипт, но работает непонятно с неудачами:
@romanbiz Если в описании ресурса снять галочку с чтение и оставить галочку запись, то скрипт будет спрашивать куда сохранить файл.
Это просто совет или объяснение по моему вопросу? Просто не очень понял.
-
@romanbiz Это просто совет. Так проще, чем руками создавать файлы а потом открывать их в скрипте.
Ещё можно поставить количество неудач-1
, тогда количество ошибок для потока будет бесконечно.
Не помню, что будет, если выставить количество неудачных выполнений в ноль. Но у меня твой скрипт выполняется одинаково, вне зависимости от количества неудачных выполнений.[696732904] [21:14:04] Поток №1 : взял location [390375838] [21:14:04] Поток №1 : очистил файлы [719879683] [21:14:13] Поток №1 : забрал урл [307652982] [21:14:13] Поток №1 : 30 [445557405] [21:14:25] Поток №4 : поток спарсил [445557405] [21:14:27] Поток №2 : поток спарсил [445557405] [21:14:30] Поток №3 : поток спарсил [21:14:30] Поток №1 : Поток выполнен успешно с сообщением "Ok" [21:14:30] Скрипт завершен корректно
-
@Fox Спасибо за совет. Вы это количество меняете в интерфейсе?
-
@romanbiz Эмм, а зачем тебе менять количество успешных выполнений? Ты же говорил про ошибку в ошибочных выполнениях.
-
@Fox Я просто для теста менял, вот записал что у меня когда 3 потока, 3 успешных, 1 неудача
http://i.imgur.com/BNFWgpG.gifv
-
@romanbiz Гифка зло.. Нужная информация вконце анимации, которая циклически воспроизводится по новой.
У тебя даже на гифке вконце всё работает правильно. Ты выставляешь 3 потока, успешное выполнение функции 3 раза, неудачное выполнение 1 раз для !всех! потоков вместе. А не для каждого по 3.
То есть выставив значение 5, у тебя отработают два раза 2 поток, два раза 3 поток, и один раз 4 поток.
-
Или я что то путаю..
3 потока, 1 успешное, 1 неуспешное.[00:15:42] Поток №2 : поток спарсил [00:15:44] Поток №4 : поток спарсил [00:15:44] Поток №3 : поток спарсил [00:15:44] Поток №1 : готово.
3 потока, 2 успешных, 1 неуспешное
[00:17:34] Поток №2 : поток спарсил [00:17:39] Поток №3 : поток спарсил [00:17:40] Поток №2 : поток спарсил [00:17:40] Поток №4 : поток спарсил [00:17:40] Поток №1 : готово.
3 потока, 3 успешных, 1 неуспешное
[00:19:11] Поток №2 : поток спарсил [00:19:18] Поток №4 : поток спарсил [00:19:23] Поток №4 : поток спарсил [00:19:23] Поток №2 : поток спарсил [00:19:25] Поток №3 : поток спарсил [00:19:25] Поток №1 : готово.
3 потока, 10 успешных, 1 неуспешное
[00:21:05] Поток №4 : поток спарсил [00:21:05] Поток №2 : поток спарсил [00:21:06] Поток №3 : поток спарсил [00:21:12] Поток №2 : поток спарсил [00:21:13] Поток №4 : поток спарсил [00:21:18] Поток №2 : поток спарсил [00:21:19] Поток №3 : поток спарсил [00:21:20] Поток №4 : поток спарсил [00:21:28] Поток №4 : поток спарсил [00:21:30] Поток №2 : поток спарсил [00:21:32] Поток №3 : поток спарсил [00:21:35] Поток №4 : поток спарсил [00:21:35] Поток №1 : готово.
Получается каждый поток отрабатывает хотя бы один раз, а потом считают общее количество успешных выполнений.. странно.
-
@Fox Ничего не понимаю.
Выставляю 3 потока, 3 успеха, 1 неудачаРезультат:
[574710937] [22:23:18] Поток №4 : поток спарсил [574710937] [22:23:34] Поток №2 : поток спарсил [574710937] [22:23:34] Поток №3 : поток спарсил [574710937] [22:23:38] Поток №2 : поток спарсил [574710937] [22:24:02] Поток №4 : поток спарсил
Почему так? Что произошло? Почему 2 и 4 потоки повторились?
Я понимаю что плаваю в самой логике работы успешных и неудачных выполнений и хочу на конкретном примере понять в чем суть. Помогите, пожалуйста.
-
@romanbiz Для чистоты эксперемента, я создал нулёвый тестовый скрипт, с одним лишь экшеном лог. Запустил его в 3 потока, 3 успеха и 3 неудачи. Результат:
[370212654] [00:28:10] Поток №1 : поток спарсил [00:28:10] Поток №1 : Поток выполнен успешно с сообщением "Ok" [370212654] [00:28:10] Поток №1 : поток спарсил [00:28:10] Поток №1 : Поток выполнен успешно с сообщением "Ok" [370212654] [00:28:10] Поток №1 : поток спарсил [00:28:10] Поток №1 : Поток выполнен успешно с сообщением "Ok" [370212654] [00:28:10] Поток №2 : поток спарсил [00:28:10] Поток №2 : Поток выполнен успешно с сообщением "Ok" [370212654] [00:28:10] Поток №3 : поток спарсил [00:28:10] Поток №3 : Поток выполнен успешно с сообщением "Ok" [00:28:10] Скрипт завершен корректно
Точно так же, 5 запусков. Получается формула:
количество потоков плюс успешных выполнений минус 1.
Сейчас обмазгую почему так..
-
Опытным путём подтверждаю формулу успешных выполнений, если количество потоков больше 1, то:
количество потоков плюс успешных выполнений минус 1.
-
@Fox Можете помочь понять логику? Мне казалось что если нет неудачных выполнений в процессе выполнения скрипта, то не будет менятся количество успешных в результате, вне зависимости прописано в настройках наличие неудачных выполнений числом больше 0 или равно 0.
Пример, 3 человека бегут марафон. При этом допускается что если кто-то в процессе упадет и сломает ногу возможна 1 замена. В результате к финишу придут 3, даже если была 1 замена. Но вдруг приходят 5. Это непонятно.
-
@romanbiz Количество неудачных выполнений ни как не влияет на количество успешных, только что проверил на тестовом скрипте. Хоть -1, хоть 0, хоть 10. При 3 потоках, 3 успешных выполнений, всегда выдаёт 5 результатов. Как по формуле выше.
Я тоже писал выше, что немного непонятно. Я вообще не использую параметры успешных выполнений и неудачных выполнений. Да и вызов функции в несколько потоков использую крайне редко.
Для решении твоей задачи, подойдёт формула выше. А по самой логике и вопроса почему так происходит, скорей всего ответит только @support .
-
@Fox Я тоже проверил в тестовом скрипте не влияет. А вот в моем влияет.
3 потока 3 успеха 0 неудач
[574710937] [23:01:41] Поток №2 : поток спарсил [574710937] [23:01:42] Поток №3 : поток спарсил [574710937] [23:01:42] Поток №4 : поток спарсил
3 потока 3 успеха 1 неудача
[574710937] [23:03:05] Поток №4 : поток спарсил [574710937] [23:03:05] Поток №2 : поток спарсил [574710937] [23:03:07] Поток №3 : поток спарсил [574710937] [23:03:12] Поток №4 : поток спарсил [574710937] [23:03:12] Поток №2 : поток спарсил
Причем результат по количеству постоянный и там и там. Я сначала подозревал может не подгружается где-то поток. Но такая картина постоянно.
-
@romanbiz все очень просто. 1 поток отработал - успех +1, перезапустился, второй отработал, успех +1, перезапустился, третий о работал, успех +1, не перезапустился потому что количество успехов достигнуто. Первый и второй работают дальше, отработают, увидят что успехи достигнуты и не будут перезапускаться. Это сделано для того что бы не потоки не закрывались посередине работы, что бы не потерять ресурсы (почты, мобильные номера, капчи и т.д.)
-
Сделал в тестовом скрипте вызов функции в несколько потоков:
3 потока, 3 успешных, 0 неудачных.
[01:09:09] Поток №1 : Начало. [01:09:09] Поток №2 : поток спарсил [01:09:09] Поток №3 : поток спарсил [01:09:09] Поток №4 : поток спарсил [01:09:09] Поток №1 : Готово.
3 потока, 3 успешных, -1 неудачных.
[01:09:56] Поток №1 : Начало. [01:09:56] Поток №2 : поток спарсил [01:09:56] Поток №2 : поток спарсил [01:09:56] Поток №2 : поток спарсил [01:09:56] Поток №3 : поток спарсил [01:09:56] Поток №4 : поток спарсил [01:09:56] Поток №1 : Готово.
Получается, если выставить количество неудач 0, то потоки отрабатывают нормально, но только 1 раз.
3 потока, !10! успешных, 0 неудачных.
[01:14:32] Поток №1 : Начало. [01:14:32] Поток №2 : поток спарсил [01:14:32] Поток №3 : поток спарсил [01:14:32] Поток №4 : поток спарсил [01:14:32] Поток №1 : Готово.