Как избавиться от состояния гонки?



  • Всем привет! Собственно возникла такая проблема, как избавиться от состояния гонки между потоками при работе с данными, я вижу два решения, но интересуют некоторые уточнения:

    1. По средствам БД: Работа с каким либо элементом базы данных, ведь не перезаписывает всю базу данных, а работает только с одним элементом? Просто насколько я понимаю, любая работа с базой данных происходит через так называемые сессии, и грубо говоря это видимо сделано для того, что бы не возникало состояние гонки, и данные из сессий записываются в базу данных, исходя из своего хронологического происхождения.

    2. По средствам глобального объекта с отдельными объектами для каждого потока, т.е.:
      При создании потока, в глобальный объект добавляется строка uniq_id:{'stat1':NaN, 'stat2': NaN}. И потом каждый поток может грубо говоря обратится к своему объекту в глобальном объекте так: VAR_GLOBAL.uniq_id.stat1 = 123;
      Однако опять же вопрос, при таком обращении к объекту, перезаписывается весь объект в памяти, или только его конкретная часть?

    Вообще, что такое глобальная переменная в Басе? Как я понимаю это запись в базе данных которая подключена к любому проекту по дефолту, или я в чём-то ошибаюсь? Хотелось бы, что бы кто-то знающий раскрыл эту тему, т.к. это очень важная тема, для понимания того,как устроена работа в многопотоке с данными. У меня допустим премиум, в котором я бы хотел сделать риалтайм отображение состояния потоков, не через дефолтный лог, а например, через красиво оформленный интерфейс с таблицей.



  • @Lipstein Вы бы сначала посмотрели мануал, хоть видео в нем и со старых версий, но основные принципы не менялись. За вас собрал ссылки по вашим вопросами...

    Ресурсы. Работа с файлами в многопотоке
    Переменные. Использование javascript.
    Многопоточность. Множество примеров.



  • @UserTrue Спасибо большое, а по вопросам Выше, Вы можете дать четкий ответ? Просто одно дело это посмотреть 6 часов видео монотонным голосом, другое дело, это просто услышать ответ от знающего человека.
    В JS ведь нет GIL, как в том же Python, поэтому и возникают такие вопросы, ведь в басе, многопоточность реализована по факту за счет субпроцессов.



  • @UserTrue Да и к слову, я эти ролики смотрел еще два года тому назад когда только начинал пользоваться БАСом. Меня категорически не устраивает вариант с блокировкой потоков, только для того что бы записать статистические данные, как это предлагает делать MainDev, так сказать)
    Может Вы меня неправильно поняли: Я хочу обрабатывать глобальную переменную\базу, в отдельном асинхронном потоке, чтобы вносить в неё данный последовательно исходя из того, как их будут редактировать рабочие потоки, в которых и происходят все действия с ними, грубо говоря, что-то вроде списка Tasks, и что бы изменения данных было логичным, и не было состояния гонки, я хочу это делать исходя из хронологии внесения изменений. И вот именно что бы это всё не городить, я и задаю этот вопрос, может быть это можно сделать как-то попроще?



  • @UserTrue Ваш ответ был бы полезен, если бы не был бесполезным, вы могли бы элементарно сказать о том, что есть возможность создания глобальных переменных из интерфейса с произвольными именами, и это решит проблему всесторонне.
    https://wiki.bablosoft.com/web-interface/#/interactingwithglobalvariables



  • @Lipstein Он вам ведь ни чего не должен и это Форум и кто хочет тот помогает.
    Я тож из Видосов не все и смотрел то, а сам больше Поиском пользуюсь и нахожу решения.
    А вы так пишите как буд то вам Обязаны, после такого отношения вам врят ли вообще кто либо станет помогать, если вы мол такой Умный, так что же спрашиваете :)
    Просто не понимаю таких Людей, вам пытаются помочь а вы же ещё и права какие то качаете.
    Извините если я задел ваше самомнение :)



  • @super84 Он не разобравшись в вопросе, даёт инфу, которая вообще не имеет смысла по отношению к моему вопросу. Это не помощь - это тупо "сбить с толку".
    И то что "мне тут никто не обязан" - опять же, лучше вообще ничего не говорить, если нечего сказать по теме, поэтому я не стесняюсь задеть чувствительность индивидумов, которые говорят чтобы сказать, а не что бы помочь.



  • @Lipstein said in Как избавиться от состояния гонки?:

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

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



  • @UserTrue По факту скажешь в чем ахиния в моих сообщениях, или только бла бла бла разводить можешь?)



  • Использовать глобальные переменные, как глобальный объект не получится. По той причине что в БАСе глобальные переменные, это не переменные по факту, а запись в базе данных которая по идее подключена к планировщику (процесс Scheduler.exe) Он и создаёт пул потоков, он же оперирует ресурсами и мониторит их, ну т.е. по факту твои предположения верны.

    @Lipstein said in Как избавиться от состояния гонки?:

    Может Вы меня неправильно поняли: Я хочу обрабатывать глобальную переменную\базу, в отдельном асинхронном потоке, чтобы вносить в неё данный последовательно исходя из того, как их будут редактировать рабочие потоки, в которых и происходят все действия с ними, грубо говоря, что-то вроде списка Tasks, и что бы изменения данных было логичным, и не было состояния гонки, я хочу это делать исходя из хронологии внесения изменений. И вот именно что бы это всё не городить, я и задаю этот вопрос, может быть это можно сделать как-то попроще?

    Вот это называется планировщик к слову, т.е. на этом базируется асинхронность любого приложения. На списке задач, который пополняется, и потом нужна функция обработчик задач. Но это слишком мудренно, согласен. Твою проблему проще всего решить так:
    При добавлении нового аккаунта в интерфейсе создаётся файлик с его уникальным идентификатором в названии, потом при запуске этого аккаунта, этот уникальный идентификатор пулится в поток, и его можно юзать для общения между бэкэндом и фронт-эндом, такое себе АПИ на костылях.



  • @mordor said in Как избавиться от состояния гонки?:

    Использовать глобальные переменные, как глобальный объект не получится. По той причине что в БАСе глобальные переменные, это не переменные по факту, а запись в базе данных которая по идее подключена к планировщику (процесс Scheduler.exe) Он и создаёт пул потоков, он же оперирует ресурсами и мониторит их, ну т.е. по факту твои предположения верны.

    Неверно. Глобальные переменные это всего лишь переменные в ОЗУ с глобальной областью видимости и к Scheduler.exe не имеют никакого отношения.

    @mordor said in Как избавиться от состояния гонки?:

    При добавлении нового аккаунта в интерфейсе

    Если задача сводится к мониторингу изменения статуса аккаунта, то это можно сделать либо через БД либо через Events(События), если используется веб интерфейс. Через БД мы просто в начале работы потока получаем/создаем запись с данными нашего аккаунта и потом по ее id меняем статусы и тд. В каком месте тут может возникнуть состояние гонки непонятно, тк каждый поток работает со своей записью в БД, а интерфейс только читает эти данные и отображает в интерфейсе.



  • @Lipstein said in Как избавиться от состояния гонки?:

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

    Обратите внимание на это действие:

    32a21681-2482-4bcd-828d-9f0e226bf089-изображение.png



  • @UserTrue Ну может быть и так, но ты не можешь написать в коде что-то вроде

    [[GLOBAL:VAR]]["new propertie"] = "new propertie";
    

    Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.

    @UserTrue said in Как избавиться от состояния гонки?:

    Если задача сводится к мониторингу изменения статуса аккаунта, то это можно сделать либо через БД либо через Events(События), если используется веб интерфейс. Через БД мы просто в начале работы потока получаем/создаем запись с данными нашего аккаунта и потом по ее id меняем статусы и тд. В каком месте тут может возникнуть состояние гонки непонятно, тк каждый поток работает со своей записью в БД, а интерфейс только читает эти данные и отображает в интерфейсе.

    Ну так или иначе, чувак не понимает как работает база данных. По сути в базах данных, действительно ведь есть сессии в каждой из которых видны внесённые изменения за определённый момент общения с БД, поэтому опять же, назвать это ахинией сложно. Просто человек, явно не до конца понимает как это устроено.



  • @Fox said in Как избавиться от состояния гонки?:

    @Lipstein said in Как избавиться от состояния гонки?:

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

    Обратите внимание на это действие:

    32a21681-2482-4bcd-828d-9f0e226bf089-изображение.png

    Благодарю, не обращал внимания вообще на это действие до покупки премиума.

    @mordor said in Как избавиться от состояния гонки?:

    @UserTrue Ну может быть и так, но ты не можешь написать в коде что-то вроде

    [[GLOBAL:VAR]]["new propertie"] = "new propertie";
    

    Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.

    @UserTrue said in Как избавиться от состояния гонки?:

    Если задача сводится к мониторингу изменения статуса аккаунта, то это можно сделать либо через БД либо через Events(События), если используется веб интерфейс. Через БД мы просто в начале работы потока получаем/создаем запись с данными нашего аккаунта и потом по ее id меняем статусы и тд. В каком месте тут может возникнуть состояние гонки непонятно, тк каждый поток работает со своей записью в БД, а интерфейс только читает эти данные и отображает в интерфейсе.

    Ну так или иначе, чувак не понимает как работает база данных. По сути в базах данных, действительно ведь есть сессии в каждой из которых видны внесённые изменения за определённый момент общения с БД, поэтому опять же, назвать это ахинией сложно. Просто человек, явно не до конца понимает как это устроено.

    Так и есть, я не до конца осведомлён в вопросах работы с БД. Тоже спасибо за помощь.

    @UserTrue said in Как избавиться от состояния гонки?:

    @mordor said in Как избавиться от состояния гонки?:

    Использовать глобальные переменные, как глобальный объект не получится. По той причине что в БАСе глобальные переменные, это не переменные по факту, а запись в базе данных которая по идее подключена к планировщику (процесс Scheduler.exe) Он и создаёт пул потоков, он же оперирует ресурсами и мониторит их, ну т.е. по факту твои предположения верны.
    

    Неверно. Глобальные переменные это всего лишь переменные в ОЗУ с глобальной областью видимости и к Scheduler.exe не имеют никакого отношения.

    @mordor said in Как избавиться от состояния гонки?:

    При добавлении нового аккаунта в интерфейсе

    Если задача сводится к мониторингу изменения статуса аккаунта, то это можно сделать либо через БД либо через Events(События), если используется веб интерфейс. Через БД мы просто в начале работы потока получаем/создаем запись с данными нашего аккаунта и потом по ее id меняем статусы и тд. В каком месте тут может возникнуть состояние гонки непонятно, тк каждый поток работает со своей записью в БД, а интерфейс только читает эти данные и отображает в интерфейсе.

    И тебе спасибо, даже в режиме срача, удалось получить полезную инфу.



  • @mordor said in Как избавиться от состояния гонки?:

    Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.

    Вообще говоря можно изменить, если писать в выполнить код., то все выполниться в одном тике и не будет конфликтов, но я так обычно не делаю тк мне не кажется это красивым. И есть еще один минус, это JSON формат хранения глоб переменных и если в них много данных то это будет создавать нагрузку.



  • @UserTrue said in Как избавиться от состояния гонки?:

    @mordor said in Как избавиться от состояния гонки?:

    Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.

    Вообще говоря можно изменить, если писать в выполнить код., то все выполниться в одном тике и не будет конфликтов, но я так обычно не делаю тк мне не кажется это красивым. И есть еще один минус, это JSON формат хранения глоб переменных и если в них много данных то это будет создавать нагрузку.

    eccdb014-59bf-49d5-81f9-34394ca93669-image.png
    Может я что-то не так пишу?
    При этом ни

    [[GLOBAL:LOG]]["name1"]
    

    ни

    [[GLOBAL:LOG]].name1
    

    Не срабатывают.



  • @mordor said in Как избавиться от состояния гонки?:

    @UserTrue said in Как избавиться от состояния гонки?:

    @mordor said in Как избавиться от состояния гонки?:

    Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.

    Вообще говоря можно изменить, если писать в выполнить код., то все выполниться в одном тике и не будет конфликтов, но я так обычно не делаю тк мне не кажется это красивым. И есть еще один минус, это JSON формат хранения глоб переменных и если в них много данных то это будет создавать нагрузку.

    Может я что-то не так пишу?
    При этом ни

    LOG["name1"]
    

    ни

    LOG.name1
    

    Не срабатывают.

    json это строка, а не объект. Вы посмотрите код действия "Лог" с использованием глобальной переменной



  • @mordor Ни так... Вот пример
    glob.xml
    2020-05-30_202511.png



  • Так ты опять же читаешь данные переменной в локальную переменную меняешь её и записываешь заново, если бы это был глобальный список, то нужен был бы ЛОК, что бы потоки не переписывали устаревшие данные (это в случае если список не пополняется, а меняются его данные по индексам именно).



  • @mordor Не нужен никакой лок, этот пример демонстрирует, что нет гонки и работа происходит синхронно, в противном случае, потоки бы перетерли данные в этой переменной и это было бы видно в логе, я не просто так сделал такой вывод лога.

    И тут не имеет значения список тут или строка, я сделал через строку для упрощения примера.


Log in to reply