Изменить глобальный массив



  • Доброго времени суток! Столкнулся с проблемой. Для решения задачи нужно, чтобы поток работал напрямую с массивом, записанным в глобальной переменной. Нужно чтобы поток менял в глобальном массиве значение, находящееся по индексу самого потока. Остальные индексы не трогал. Ну и весь глобальный массив желательно не перезаписывать. Кто-то сталкивался с подобными задачами?



  • @pragmatik https://community.bablosoft.com/topic/4681/список-в-глобальной-переменной

    Ну или создай объект в глобальной переменной и добавляй массивы по индексу номера потока.



  • @pragmatik said in Изменить глобальный массив:

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

    Такого способа как я понял нет. Потому что глобальная переменная, это не совсем переменная.

    @pragmatik said in Изменить глобальный массив:

    Кто-то сталкивался с подобными задачами?

    Я делал вот так:

    [[VAL]] = JSON.parse(P("basglobal", "FIN_LIST")); // Читаешь глобальную в локальную
    
    // Делаешь с локальной переменной что угодно, НО БЕЗ АСИНХРОННЫХ ДЕЙСТВИЙ!
    
    PSet("basglobal", "FIN_LIST", JSON.stringify([[VAL]]));  // Записываешь обратно в глобальную.
    


  • Я бы сказал, что мне вот это больше подходит: https://community.bablosoft.com/topic/5724/lock-в-многопотоке/7

    Если в одном потоке происходит запись в глобальный массив, то в глобальную переменную типа GLOBAL:LOCK происходит запись true (залочено), после записи - false (разлочено). Следующие потоки ждут разлочки - false, и только после неё записывают. Причём ждут с рандомным интервалом миллисекунд, чтобы если несколько потоков встали одновременно, какой-то из них был первым, какой-то вторым и т.д.



  • @senerg said in Изменить глобальный массив:

    [[VAL]] = JSON.parse(P("basglobal", "FIN_LIST")); // Читаешь глобальную в локальную

    // Делаешь с локальной переменной что угодно, НО БЕЗ АСИНХРОННЫХ ДЕЙСТВИЙ!

    PSet("basglobal", "FIN_LIST", JSON.stringify([[VAL]])); // Записываешь обратно в глобальную.

    Чем вам асинхронные действия то так не угодили? Я уже много раз вам говорил, что нет разницы какие действия применять, всё зависит от задачи.

    @pragmatik said in Изменить глобальный массив:

    Я бы сказал, что мне вот это больше подходит: https://community.bablosoft.com/topic/5724/lock-в-многопотоке/7

    Если в одном потоке происходит запись в глобальный массив, то в глобальную переменную типа GLOBAL:LOCK происходит запись true (залочено), после записи - false (разлочено). Следующие потоки ждут разлочки - false, и только после неё записывают. Причём ждут с рандомным интервалом миллисекунд, чтобы если несколько потоков встали одновременно, какой-то из них был первым, какой-то вторым и т.д.

    Обратите внимание на вот это моё сообщение в той теме:
    @fox said in LOCK в многопотоке:

    @senerg Где то у меня был тестовый скрипт, где я проверял на возможные ошибки одновременную запись. Я в 100 потоков с рандомными задержками записывал случайную строку в глобальную переменную и следом сразу проверял, что если в глобальной переменной другая строка, то прекратить скрипт. В итоге скрипт отработал 10 минут без каких либо ошибок. Думаю в рабочем скрипте более жёстких условий одновременной записи в глобальную переменную не будет.

    Я одновременно записывал данные в глобальную переменную в 100 потоков! И за 10 минут работы это не привело к ошибке. lock в глобальной переменной уже реализован.



  • @fox said in Изменить глобальный массив:

    Чем вам асинхронные действия то так не угодили?

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

    @fox said in Изменить глобальный массив:
    Я уже много раз вам говорил, что нет разницы какие действия применять, всё зависит от задачи.

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

    @fox said in Изменить глобальный массив:

    Я одновременно записывал данные в глобальную переменную в 100 потоков! И за 10 минут работы это не привело к ошибке. lock в глобальной переменной уже реализован.

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


Log in to reply