Вопрос по многопоточности. Запуск потока после сбора нужных данных



  • Всем привет.

    Есть пара сайтов. На каждом из них есть нужные комментарии, которые и парсятся. В итоге все они сохраняются в CSV файл, но они между собой связаны (по датам).

    Выходит мне нужно, чтобы

    1. Скрипт запустился
    2. Первый поток начал парсить сайт N и записывать переменные
    3. Второй поток начал парсить сайт Y и записывать переменные
    4. Третий поток ждал, пока 1 и 2 соберут данные и уже тогда записал их все в нужном формате.
    5. Повторяется 100500 раз

    Пробовал "номер потока", потом по "if thread_numbber == N", правда 3 поток выдает ошибку, переменных нет.



  • а переменные глобальные?



  • Скрипт полностью работает, если убрать потоки. Правда скорость выполнения больше, чем требуется.

    В итоге выходит может быть ошибка в том, что перемены не глобальные? То есть, если я запускаю скрипт в 3 потока, то даже в этом случае, как мне 3 потока или в конце 2 (наверно так лучше, все равно нужно ждать окончания выполнения первых двух) сделать действие, запускаемое после отработки первых 2-ух?



  • Решение проблемы = 300 рублей, пойдет?



  • @Krotiki Общая схема такова :) Создай глобальную переменную можно числовую. Поток после того как закончит парсинг увеличивает ее на 1. А остальные потоки ждут. Например сделай цикл while (true) в нем проверка если переменная меньше, чем надо то спим к примеру 10 сек, а если все ок то делаем break и идем дальше работать с данными.



  • @Krotiki Вот схематичный пример0_1520263584366_exempl.xml



  • @Denis_krsk Не работает. Сделал все как в схеме, все равно ошибка. Плюс у меня 1 поток - 1 функция, я использовал определения номера потока через "==", а не больше/меньше, правда наврядли из-за этого

    ![alt text](0_1520265141764_2018-03-05_18-49-16.png image url)



  • но это же все разжовано



  • @Krotiki А данные парсер сохраняет в глобальные переменные? Я бы вообще ресурсы использовал



  • чеёрт, чтобы многопоток, чтобы обмениваться данными между потоками глобальные переменные или ресурсы, чтобы в каждом потоке выполнять определенную функцию получать номер потока и в зависимости от номера потока выполнять соответствующую ему функцию, или ресурсы, если до запуска потоков нужнно чтото сделат/инициализировать онеапликейшен.
    в это случае количество потоков должно сответствоывать количеству функций желательно. каждый поток может породить поток но лучше так не делать пока не прекрощаешь задовать вопросы. почему я должет смотреть десятки часов видео я конечно не буду а они нет



  • @ruzne Вам по письму и изложению еще долго до адекватности. Каждый мастер в своем деле.

    Если кто-то готов помочь, напишите, я заплачу сколько потребуется, но мне нужно именно решение.



  • @Krotiki said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:

    @ruzne Вам по письму и изложению еще долго до адекватности. Каждый мастер в своем деле.

    Если кто-то готов помочь, напишите, я заплачу сколько потребуется, но мне нужно именно решение.

    дак какой вопрос и такой.
    в чем проблема, какие выдает ошибки, пример не работающего скрипта.



  • @Krotiki У меня сейчас нет времени накидать скрипт именно по вашему вопросу, но такие вещи делаются успешно, и у меня есть пример скрипта для подобных ситуаций. Прямо вашу проблему он не решает, но точно демонстрирует пути решения.

    Мой пост в англоязычной части форума: http://community.bablosoft.com/topic/3776/calling-different-function-in-threads/14# В нем скрипт.

    Если нужно доп демо или сделать работу - пишите в личку.



  • @ruzne вроде он из списка берется же данные а глобальный список не возможно сделать ну может и можно через JS



  • @Krotiki said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:

    @Denis_krsk Не работает. Сделал все как в схеме, все равно ошибка. Плюс у меня 1 поток - 1 функция, я использовал определения номера потока через "==", а не больше/меньше, правда наврядли из-за этого

    ![alt text](0_1520265141764_2018-03-05_18-49-16.png image url)

    тебе советую использовать ресурсы для этой цели



  • @GamiD said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:

    @ruzne вроде он из списка берется же данные а глобальный список не возможно сделать ну может и можно через JS

    почему?
    создать список
    наполнить список
    создать глобальную переменную
    ->сюда
    присвоить глобальной переменной список
    при каждом изменении списка ->туда



  • @ruzne, если точнее, то ещё
    -читать глобальную переменную со списком в локальную
    -изменять список
    -сохранять локальный список в глобальную переменную

    При этом не прерывать блокировку глобальной переменной асинхронными действиями, такими как вывод чего либо в лог.



  • @Antonio said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:

    @ruzne, если точнее, то ещё
    -читать глобальную переменную со списком в локальную
    -изменять список
    -сохранять локальный список в глобальную переменную

    При этом не прерывать блокировку глобальной переменной асинхронными действиями, такими как вывод чего либо в лог.

    именно, и чтобы дожувать для большего понимания, нужно учитывать что копируется именно значение переменной, а не что было бы удобнее указатель, в новом потоке нужно коприровать обратно в обычную переменную, потому что то что можно сделать с глобальной переменной очень ограничено. И для бульдозеристов, несмотря на копирование переменные никак не связаны и именения одной не влечет измениня в другой



  • Спасибо за ответы. По ресурсам:

    • Даже если я запишу все в ресурсы, как потом доставать из ресурса нужное значение? Все значения, которые у меня есть я выбираю посредством их имени в переменной, а в ресурсе это будет список и индентификация только по порядку возможна, верно? Скорее всего ресурсы не подойдут
    • Получается надо сделать глобальными переменными, но тогда вопросы:
      • "[[SAVE_ANSWER_1]] = answer;" - это сохраняется по коду данные answer в переменную SAVE_ANSWER_1, как ее глобальной в коде сделать в данном коде?
      • Здесь как сделать "ANSWER_BACK_1" глобальной? 0_1520335423437_upload-df0e274d-f49f-431f-adfd-1e3c1e4143a0




  • @Krotiki said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:

    Здесь как сделать "ANSWER_BACK_1" глобальной?

    Попробуйте в OnApplicationStart инициализировать глобальную переменную. И в коде этой глобальной переменной присвоить значение локальной переменной ANSWER_BACK_1. Дальше глобальная переменная будет как посредник между глобальной и локальной областью. Когда нужно считываем с нее значение в локалку, когда нужно пишем в нее с локалки в глобалку.


Log in to reply
 

Looks like your connection to Bablosoft was lost, please wait while we try to reconnect.