@sergerdn said in Новая капча от Яндекс ?:
Если Яндексу начнет вводить пару новых иконок каждый день(это не сложно для него) нейросеть справится?
Да, только до обучать....
Всем привет! Собственно возникла такая проблема, как избавиться от состояния гонки между потоками при работе с данными, я вижу два решения, но интересуют некоторые уточнения:
По средствам БД: Работа с каким либо элементом базы данных, ведь не перезаписывает всю базу данных, а работает только с одним элементом? Просто насколько я понимаю, любая работа с базой данных происходит через так называемые сессии, и грубо говоря это видимо сделано для того, что бы не возникало состояние гонки, и данные из сессий записываются в базу данных, исходя из своего хронологического происхождения.
По средствам глобального объекта с отдельными объектами для каждого потока, т.е.:
При создании потока, в глобальный объект добавляется строка 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 Как избавиться от состояния гонки?:
поэтому я не стесняюсь задеть чувствительность индивидумов, которые говорят чтобы сказать, а не что помочь.
Вы ее никак не заденете, у меня уже выработался иммунитет к таким как вы индивидуумам, но вот всеобщий игнор ахинеи, что вы написали в сообщениях начиная с первого, видимо вас сильно расстроил!
Использовать глобальные переменные, как глобальный объект не получится. По той причине что в БАСе глобальные переменные, это не переменные по факту, а запись в базе данных которая по идее подключена к планировщику (процесс Scheduler.exe) Он и создаёт пул потоков, он же оперирует ресурсами и мониторит их, ну т.е. по факту твои предположения верны.
@Lipstein said in Как избавиться от состояния гонки?:
Может Вы меня неправильно поняли: Я хочу обрабатывать глобальную переменную\базу, в отдельном асинхронном потоке, чтобы вносить в неё данный последовательно исходя из того, как их будут редактировать рабочие потоки, в которых и происходят все действия с ними, грубо говоря, что-то вроде списка Tasks, и что бы изменения данных было логичным, и не было состояния гонки, я хочу это делать исходя из хронологии внесения изменений. И вот именно что бы это всё не городить, я и задаю этот вопрос, может быть это можно сделать как-то попроще?
Вот это называется планировщик к слову, т.е. на этом базируется асинхронность любого приложения. На списке задач, который пополняется, и потом нужна функция обработчик задач. Но это слишком мудренно, согласен. Твою проблему проще всего решить так:
При добавлении нового аккаунта в интерфейсе создаётся файлик с его уникальным идентификатором в названии, потом при запуске этого аккаунта, этот уникальный идентификатор пулится в поток, и его можно юзать для общения между бэкэндом и фронт-эндом, такое себе АПИ на костылях.
@mordor said in Как избавиться от состояния гонки?:
Использовать глобальные переменные, как глобальный объект не получится. По той причине что в БАСе глобальные переменные, это не переменные по факту, а запись в базе данных которая по идее подключена к планировщику (процесс Scheduler.exe) Он и создаёт пул потоков, он же оперирует ресурсами и мониторит их, ну т.е. по факту твои предположения верны.
Неверно. Глобальные переменные это всего лишь переменные в ОЗУ с глобальной областью видимости и к Scheduler.exe не имеют никакого отношения.
@mordor said in Как избавиться от состояния гонки?:
При добавлении нового аккаунта в интерфейсе
Если задача сводится к мониторингу изменения статуса аккаунта, то это можно сделать либо через БД либо через Events(События), если используется веб интерфейс. Через БД мы просто в начале работы потока получаем/создаем запись с данными нашего аккаунта и потом по ее id меняем статусы и тд. В каком месте тут может возникнуть состояние гонки непонятно, тк каждый поток работает со своей записью в БД, а интерфейс только читает эти данные и отображает в интерфейсе.
@Lipstein said in Как избавиться от состояния гонки?:
У меня допустим премиум, в котором я бы хотел сделать риалтайм отображение состояния потоков, не через дефолтный лог, а например, через красиво оформленный интерфейс с таблицей.
Обратите внимание на это действие:

@UserTrue Ну может быть и так, но ты не можешь написать в коде что-то вроде
[[GLOBAL:VAR]]["new propertie"] = "new propertie";
Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.
@UserTrue said in Как избавиться от состояния гонки?:
Если задача сводится к мониторингу изменения статуса аккаунта, то это можно сделать либо через БД либо через Events(События), если используется веб интерфейс. Через БД мы просто в начале работы потока получаем/создаем запись с данными нашего аккаунта и потом по ее id меняем статусы и тд. В каком месте тут может возникнуть состояние гонки непонятно, тк каждый поток работает со своей записью в БД, а интерфейс только читает эти данные и отображает в интерфейсе.
Ну так или иначе, чувак не понимает как работает база данных. По сути в базах данных, действительно ведь есть сессии в каждой из которых видны внесённые изменения за определённый момент общения с БД, поэтому опять же, назвать это ахинией сложно. Просто человек, явно не до конца понимает как это устроено.
@Fox said in Как избавиться от состояния гонки?:
@Lipstein said in Как избавиться от состояния гонки?:
У меня допустим премиум, в котором я бы хотел сделать риалтайм отображение состояния потоков, не через дефолтный лог, а например, через красиво оформленный интерфейс с таблицей.
Обратите внимание на это действие:
Благодарю, не обращал внимания вообще на это действие до покупки премиума.
@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 формат хранения глоб переменных и если в них много данных то это будет создавать нагрузку.

Может я что-то не так пишу?
При этом ни
[[GLOBAL:LOG]]["name1"]
ни
[[GLOBAL:LOG]].name1
Не срабатывают.
@mordor said in Как избавиться от состояния гонки?:
@UserTrue said in Как избавиться от состояния гонки?:
@mordor said in Как избавиться от состояния гонки?:
Тебе сначала нужно вытащить из неё данные в локальную переменную, внести изменнения в эту локальную переменную, и перезаписать глобальную переменную. Поэтому тут может возникнуть гонка, либо нужно юзать лок, чего ТС явно не хочет.
Вообще говоря можно изменить, если писать в выполнить код., то все выполниться в одном тике и не будет конфликтов, но я так обычно не делаю тк мне не кажется это красивым. И есть еще один минус, это JSON формат хранения глоб переменных и если в них много данных то это будет создавать нагрузку.
Может я что-то не так пишу?
При этом ниLOG["name1"]ни
LOG.name1Не срабатывают.
json это строка, а не объект. Вы посмотрите код действия "Лог" с использованием глобальной переменной
Так ты опять же читаешь данные переменной в локальную переменную меняешь её и записываешь заново, если бы это был глобальный список, то нужен был бы ЛОК, что бы потоки не переписывали устаревшие данные (это в случае если список не пополняется, а меняются его данные по индексам именно).
@mordor Не нужен никакой лок, этот пример демонстрирует, что нет гонки и работа происходит синхронно, в противном случае, потоки бы перетерли данные в этой переменной и это было бы видно в логе, я не просто так сделал такой вывод лога.
И тут не имеет значения список тут или строка, я сделал через строку для упрощения примера.