Помогите с многопотоком (логикой)

russya

Client
Регистрация
08.07.2014
Сообщения
745
Благодарностей
78
Баллы
28
Всем привет! есть таблица. Беру строку ставлю + это значит что строка в работе, когда сделал все что нужно, сохраняю изменения в эту строку и ставлю +- это значит что закончил работу. Потом смотрю след. строку, но только игнорирую + и +- и так до конца таблицы. В многопотоке все хорошо работает.
Но мне нужно с 1 потока отправить в телеграмм что шаблон отработал, желательно с последнего.

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

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 642
Баллы
113
сообщения может отправлять не работавший поток. Поток, который хотел взять строку для работы, но по условиям такую не нашёл. Он же должен дать какой-то сигнал другим потокоам, акой-то флаг-файл или флаг-глобалка, что сообщение уже отправлено, повторять не надо. При этом этот флаг должен удаляться, если в таблице появиться хоь одна строка для работы
 
  • Спасибо
Реакции: russya

backoff

Client
Регистрация
20.04.2015
Сообщения
6 095
Благодарностей
6 496
Баллы
113
я юзаю 2 способа, оба работают отлично
сначала совет:
не обозначай символами работу строки, делай нормальный статус текстовый - на много удобнее, при работе на долгосрок с кучей шабов, от сюда и логика будет правильно по итогу
сделай столбец - status
у статуса будут свои значения например
work - работает
bad - плохо выполнился
errore - с ошибкой
done - все ок
и тп

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

второй варик, если у тебя много шаблонов в потоке и надо отслеживать работу, а потом оповещать, то лучше это почитай тогда
https://zennolab.com/discussion/threads/kak-ja-organizoval-polnuju-avtonomnost-servera-skaz-o-tom-kak-avtomatizirovat-neskolko-shablonov.53582/

если вкратце, то просто отдельный шаб запускаешь раз в минуту, и тот проверяет работает шаб или нет, и там уже принимает решение
 
  • Спасибо
Реакции: russya

ffeniks

Client
Регистрация
03.06.2016
Сообщения
312
Благодарностей
411
Баллы
63
Вариант backoff + mysql бд , по завершению каждый поток делает запрос в бд, на подобии
SELECT COUNT (id) from table test WHERE status = end,
если запрос отдаёт больше 0, то по ветке завершаешь работу потока.
Если отдал ноль значит все потоки отработали и по второй ветке шлёшь сообщение в телегу.
 
  • Спасибо
Реакции: russya

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Благодарностей
395
Баллы
63
Вернет 1 если последний поток, 0 если не последний - в красный кубик для c#
В ссылки из GAS подключить - System.Xml
В OwnCode - using System.Xml;
Код:
Guid taskId = Guid.Parse(project.TaskId);
            string taskInfo = ZennoPoster.GetTaskInfo(taskId);
                    
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml("<Task>" + taskInfo + "</Task>");
                    
            System.Xml.XmlNode maxTries = doc.SelectSingleNode("Task/ExecutionSettings/NumberOfTries");
        
            if (maxTries != null)
            {
                if (int.Parse(maxTries.InnerText) == 1)
                {
                    return 1;
                }            
            }
            return 0;
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63
Всем привет! есть таблица. Беру строку ставлю + это значит что строка в работе, когда сделал все что нужно, сохраняю изменения в эту строку и ставлю +- это значит что закончил работу. Потом смотрю след. строку, но только игнорирую + и +- и так до конца таблицы. В многопотоке все хорошо работает.
Но мне нужно с 1 потока отправить в телеграмм что шаблон отработал, желательно с последнего.

Как можно построить логику? как узнать какой последний поток? я думал может брать в переменную номер строки и количество строк в таблице и в конце сравнивать, если номер строки и количество строк равны, тогда отправляем сообщения. Но бывают потоки подвисают или прокси не очень...и 1 поток уже взял последнюю строку, а тот еще работает. Короче идея не очень....но покуда других нету
Как делал я. Все банально и просто.
1) Создаешь файл со значением 0.
2) Поток отработал свою работу: нет больше новых значений в списке/таблице и т.п. Берет значение из файла и приплюсовывает туда 1, возвращает это значение в файл.
3) Проверяем это значение на последний поток (нужно создать в настройках поле для количества поток), если равно к примеру 10му потоку, то отправляем в телегу нужные данные, если нет, то поток* просто заканчивает свою работу.
Многопоток.png
Многопоток2.png

Как по мне, то это просто и практично. Если нужно больше потоков (100), то ставишь это значение в настройках и се. Тоже думал как проверять на последний поток с помощью кода, команд и т.п. Остановился на этом варианте (коих я перебрал много).
P.S. Не забудь только в конце шаба опять обнулить значение в файле.
 
  • Спасибо
Реакции: russya

russya

Client
Регистрация
08.07.2014
Сообщения
745
Благодарностей
78
Баллы
28
Вернет 1 если последний поток, 0 если не последний - в красный кубик для c#
В ссылки из GAS подключить - System.Xml
В OwnCode - using System.Xml;
Код:
Guid taskId = Guid.Parse(project.TaskId);
            string taskInfo = ZennoPoster.GetTaskInfo(taskId);
                   
            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml("<Task>" + taskInfo + "</Task>");
                   
            System.Xml.XmlNode maxTries = doc.SelectSingleNode("Task/ExecutionSettings/NumberOfTries");
       
            if (maxTries != null)
            {
                if (int.Parse(maxTries.InnerText) == 1)
                {
                    return 1;
                }           
            }
            return 0;
Всем спасибо за помощь! но само лучше понравилось вот это. Просто я на продужу хочу и несколько шаблонов не охота запускать. Этот пример меня устраивает..уже и протестил. Спасибо!
 
  • Спасибо
Реакции: SergSh

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