Дальнейшее использование строк полученных из регулярки



  • @korzhec, чтобы к списку имели доступ все потоки, нужно сохранить его в глобальную переменную. Потом работать с ним так: прочесть эту глобальную переменную, сохранить в локальную, сделать действие со списком, записать обратно в глобальную переменную. И следить, чтобы между чтением глоб. переменной и записью в глоб.переменную не было асинхронных действий (есть темы про это на форуме). Например, в лог выводить ничего нельзя.



  • @Antonio
    спасибо за ответ.
    зачем список выводить в глобальную переменную?
    неужели нет легкого способа, как из переменной со спарсенными строками, брать поочередно в этом же потоке строки для своих нужд, не записывая их при этом в ресурсы и файлы



  • @korzhec, в этом же потоке просто список читаешь и все. Я ответил про многопоток.



  • @Antonio я не совсем понимаю смысла второй записи в глобальную переменную



  • This post is deleted!


  • @korzhec, ну да, там деталь ещё есть. Строки из локального списка нужно брать с удалением. И этот измененный список мы перезаписываем в глоб.переменную. Иначе в других потоках будут те же строки браться.
    Можно и без удаления, но брать строки по номеру. Но все равно нужно будет тогда номер последней использованной строки также читать и писать в глоб.переменную.



  • @Antonio то есть получаются экшны: Установить глобальную переменную (с массивом спарсенных данных) > установить значения лок переменной как у глобальной ( с удалением этих значений из глобальной)> получить элемент списка (из этой локальной переменной) c удалением > действие с ним > очистить глобальную переменную ( не совсем понял что значит перезаписать если в локальной ничего не осталось)



  • @korzhec, в общем вот пример. Забыл сказать, что нужно ещё функцию OnApplicationStart создать, в которой дейсвия выполняются один раз перед стартом всех потоков. В ней создаем список (из файла или как угодно). Дальше потоки выполняют то, что в функции Main.
    0_1519455137025_exemple.xml

    @korzhec said in Дальнейшее использование строк полученных из регулярки:

    не совсем понял что значит перезаписать если в локальной ничего не осталось

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



  • Многопоточное программирование никогда не было легким.

    Ребята, сорри, но в таком подходе есть ошибки. Это может зачастую работать, но иногда глючить, мучая разработчика мистикой при отладке. Важно, чтобы целиком действие "считать список-получить элемент-удалить элемент" было "атомарным". В таком подходе это не так.

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

    Поэтому надо использовать глобальный "mutex", т.е. переменную, все операции с которой атомарны, и, в каждый момент только один поток может ею "завладеть", а другие будут вынуждены ждать к ней доступа. Для этого можно использовать глобальную переменную: флаг true/false.

    Поток, которому повезло прочитать ее значение в момент, когда оно false, сразу же устанавливает ее в true. Дальше он может провести со списком любые операции. По завершении поток сбрасывает значение флага в false. При этом остальные потоки при прочтении значения true входят в цикл ожидания, периодически проверяя не стало ли оно false. Всё это работает потому, что чтение/запись глобальной переменной - атомарная операция.

    Есть еще вариант сделать это проще. Используйте ресурс типа "строки из файла", направьте его на существующий пустой файл. Успешных использований - 1, неуспешных - сколько вам надо. Дальше пишите в ресурс или читайте из ресурса с помощью кубиков как вам надо. Хоть в одно-, хоть в многопотоке. Остальные флаги и значения в ресурсе проставьте по вкусу, т.е. по логике скрипта.



  • @daemons, на форуме есть инфа про синхронные/асинхронные действия. Флаги не нужны. Главное понимать, что другие потоки будут ждать с момента синхронного действия до появления асинхронного. Т.е. например с чтения глоб.переменной до вывода чего-то в лог. Просто не прерываешь синхронные действия асинхронными, пока не сохранишь изменения для других потоков и все дела.



  • @Antonio Уфф, я не графоман, но, вот, опять многа букаф.

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

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

    Отступление. Даже если допустить, что вы правы, то представьте себе ситуацию, когда поток так и не выполнит ни одного асинхронного действия до самого своего конца, а будет делать только синхронные. Тогда получается что? Ни один другой поток так и не сдвинется с места, ожидая окончания цепи синхронных действий, причем, возможно, никак не связанных с этим пресловутым списком? Какой же нам толк от такой многопоточности? Конец отступления.

    Так вот. Формально понятия синхронности и многопоточности никак не связаны. Вы знали, что Javascript однопоточен? И в Node.js, и в браузере? И при этом он может быть асинхронным.

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

    Если хорошенько разбираться с этими понятиями, то можно дойти до реально сложных, но интересных вещей. Надо потратить время, да. Но зато и каша в голове устранится.



  • Спасибо большое за помощь) нашел видео, разобрался.
    И еще по теме парсинга: после извлечения всех данных, строки находятся в переменной. При попытке записать переменную в txt , строки там появляются не построчно, а через запятую. Скажите, пожалуйста, как сделать чтобы они записывались построчно?



  • @daemons, да я как-бы не программист вообще) Так, мимо проходил) Я тут, на форуме, как правило отвечаю на вопросы, если сам на практике сталкивался с задачей. Так-что как оно по уму или по идеологии должно быть, мне не столь важно)
    Вот пруфы - http://community.bablosoft.com/topic/364/многопоточное-использование-ресурсов-текстовых-файлов-как-списков/12



  • @korzhec, там список в переменной или там и есть одна строка через запятые? Если там список, то нужно "Файловая система>Записать список в файл". Если там строка, то "Список>Парсить строку" и уже этот список в "Файловая система>Записать список в файл".



  • @Antonio Да, большинство просто делают как знают, это нормально. Надо зарабатывать. Подробно разбираться, вроде бы, смысла и времени нет.

    Вот как раз, я глянул топик. По хорошему надо в гитхабе покопаться и осмыслить, но времени нет )) Навскидку, автор говорит о блоках кода, который заключен между section_start()! и section_end()! Если там не встречается строка с !, то тогда выполнение блока "безопасно".

    Хотя section_start()! и section_end()! в скрипте выглядят как вызовы функций, на самом деле это специальные метки для парсинга и обозначения границ блоков кода. Дальше при фактическом выполнении проекта, эти блоки извлекаются из какого-то контейнера в какой-то очередности, и до и после каждого извлечения что-то там происходит. Может быть, как раз предпринимаются меры по обеспечению потокобезопасности. И вся эта движуха внутри каждого рабочего потока Chrome. В своё время разберусь ещё ))



  • @korzhec я сделал через запись в ресурс. у меня немного другая задача, но все норм. выделил один поток для того чтобы он чекал файл и брал с него строки (записывает в этот файл другой скрипт) после того как забрал весь файл, записываю все троки в ресурс, который создан в начале работы скрипта. и потом уже все потоки по очереди берут эти строки. а вообще вариантов и всяких извращений можно кучу придумать


Log in to reply
 

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