Как правильно работать в многопоточном режиме (циклы и взаимодействие потоков)

ilyaogurtzov

Новичок
Регистрация
26.01.2023
Сообщения
18
Благодарностей
0
Баллы
1
Всем привет!
Объясните, пожалуйста, логику работы в многопоточном режиме. Сколько читал и пока только запутался.

Сейчас я сделал проект в бесконечном цикле, который работает с Google таблицами и на каждом круге прибавляет значение переменной на 1, далее снова проходит круг и уже берёт данные с ячейки 2 и т.д..

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

1. Как мне упорядочить потоки, чтобы они учитывали друг друга? (первый поток взял цифру 1, второй цифру 2 и т.д.). Пока вижу какой-то костыль с подгрузкой паузы (10 сек + переменная в шаге) и связку взять данные - записать новые данные (первый поток берёт цифру 1 и пишет вместо неё цифру 2, а второй поток в это время ждет и когда обращается к google таблице там уже цифра 2). Но такое решение похоже на именно костыль

2. Я хочу каждые N-циклов переводить на другую ветку работы (делай сначала одно, а потом после 10 раз делай другое). В бесконечном все понятно, мы вводим переменную и её увеличиваем. А в многопотоке как? Делать переменную и писать в таблицу, далее каждый поток обращается к этой таблице и смотрит по какому кругу идти?
 

d7day

Client
Регистрация
18.08.2019
Сообщения
12
Благодарностей
12
Баллы
3
Зацикливать любые проекты - это само по себе неправильно.
Использовать блеклисты самое простое что можно в многопотоке


C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["id"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["list"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
            return "yes";
    }
}
// если ничего не нашли возвращаем "no"
return "no";
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
995
Благодарностей
542
Баллы
93
Зацикливать любые проекты - это само по себе неправильно.
Использовать блеклисты самое простое что можно в многопотоке


C#:
// берем из переменной текст, который надо искать
var textContains = project.Variables["id"].Value;
// получаем список, в котором будем искать
var sourceList = project.Lists["list"];
// ищем в каждой строчке в списке
lock(SyncObjects.ListSyncer)
{
    for(int i=0; i < sourceList.Count; i++)
    {
        // читаем строку из списка
        var str = sourceList[i];
        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(textContains))
            return "yes";
    }
}
// если ничего не нашли возвращаем "no"
return "no";
Lock разве нужен при чтении? - обычно при записи\изменении строк, Lock добавляют
 

White trash

Client
Регистрация
09.06.2014
Сообщения
835
Благодарностей
364
Баллы
63
Как вариант, дать этим потокам список куда они будут записывать и читать переменную с номером ячейки.
 

d7day

Client
Регистрация
18.08.2019
Сообщения
12
Благодарностей
12
Баллы
3

DevOps

Client
Регистрация
30.11.2020
Сообщения
496
Благодарностей
314
Баллы
63
Задел на будущее так сказать :-)
Но вообще да, не нужен
Лок обязателен если входной ресурс один для всех потоков
И для выходных также
Иначе - если рукожоп -"вылет" программы (нет try/catch/finaly)
Если есть указанное выше - "потеря" данных
Загрузил миллион, на выходе получил 150К
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)