Написал многопоточный скрипт, но работает непонятно с неудачами



  • Всем привет. Изучаю многопоточность. Для этого написал скрипт. Скрипт сначала заходит в поиск пользователей ВК по определенному запросу, затем парсит ссылки на страницы пользователей с 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 : поток спарсил

    0_1500738143463_count-friends.xml



  • @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 Спасибо за совет. Вы это количество меняете в интерфейсе? 0_1500740250947_neud.PNG



  • @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, не перезапустился потому что количество успехов достигнуто. Первый и второй работают дальше, отработают, увидят что успехи достигнуты и не будут перезапускаться. Это сделано для того что бы не потоки не закрывались посередине работы, что бы не потерять ресурсы (почты, мобильные номера, капчи и т.д.)


Log in to reply