Вопрос по многопоточности. Запуск потока после сбора нужных данных
-
Всем привет.
Есть пара сайтов. На каждом из них есть нужные комментарии, которые и парсятся. В итоге все они сохраняются в CSV файл, но они между собой связаны (по датам).
Выходит мне нужно, чтобы
- Скрипт запустился
- Первый поток начал парсить сайт N и записывать переменные
- Второй поток начал парсить сайт Y и записывать переменные
- Третий поток ждал, пока 1 и 2 соберут данные и уже тогда записал их все в нужном формате.
- Повторяется 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 функция, я использовал определения номера потока через "==", а не больше/меньше, правда наврядли из-за этого

-
но это же все разжовано
-
@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 функция, я использовал определения номера потока через "==", а не больше/меньше, правда наврядли из-за этого

тебе советую использовать ресурсы для этой цели
-
@GamiD said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:
@ruzne вроде он из списка берется же данные а глобальный список не возможно сделать ну может и можно через JS
почему?
создать список
наполнить список
создать глобальную переменную
->сюда
присвоить глобальной переменной список
при каждом изменении списка ->туда
-
@ruzne, если точнее, то ещё
-читать глобальную переменную со списком в локальную
-изменять список
-сохранять локальный список в глобальную переменнуюПри этом не прерывать блокировку глобальной переменной асинхронными действиями, такими как вывод чего либо в лог.
-
@Antonio said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:
@ruzne, если точнее, то ещё
-читать глобальную переменную со списком в локальную
-изменять список
-сохранять локальный список в глобальную переменнуюПри этом не прерывать блокировку глобальной переменной асинхронными действиями, такими как вывод чего либо в лог.
именно, и чтобы дожувать для большего понимания, нужно учитывать что копируется именно значение переменной, а не что было бы удобнее указатель, в новом потоке нужно коприровать обратно в обычную переменную, потому что то что можно сделать с глобальной переменной очень ограничено. И для бульдозеристов, несмотря на копирование переменные никак не связаны и именения одной не влечет измениня в другой
-
Спасибо за ответы. По ресурсам:
- Даже если я запишу все в ресурсы, как потом доставать из ресурса нужное значение? Все значения, которые у меня есть я выбираю посредством их имени в переменной, а в ресурсе это будет список и индентификация только по порядку возможна, верно? Скорее всего ресурсы не подойдут
- Получается надо сделать глобальными переменными, но тогда вопросы:
- "[[SAVE_ANSWER_1]] = answer;" - это сохраняется по коду данные answer в переменную SAVE_ANSWER_1, как ее глобальной в коде сделать в данном коде?
- Здесь как сделать "ANSWER_BACK_1" глобальной?
-
@Krotiki said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:
как ее глобальной в коде сделать
никак
-
@Krotiki said in Вопрос по многопоточности. Запуск потока после сбора нужных данных:
Здесь как сделать "ANSWER_BACK_1" глобальной?
Попробуйте в OnApplicationStart инициализировать глобальную переменную. И в коде этой глобальной переменной присвоить значение локальной переменной ANSWER_BACK_1. Дальше глобальная переменная будет как посредник между глобальной и локальной областью. Когда нужно считываем с нее значение в локалку, когда нужно пишем в нее с локалки в глобалку.