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

  • Автор темы Автор темы russya
  • Дата начала Дата начала

russya

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

Как можно построить логику? как узнать какой последний поток? я думал может брать в переменную номер строки и количество строк в таблице и в конце сравнивать, если номер строки и количество строк равны, тогда отправляем сообщения. Но бывают потоки подвисают или прокси не очень...и 1 поток уже взял последнюю строку, а тот еще работает. Короче идея не очень....но покуда других нету
 
сообщения может отправлять не работавший поток. Поток, который хотел взять строку для работы, но по условиям такую не нашёл. Он же должен дать какой-то сигнал другим потокоам, акой-то флаг-файл или флаг-глобалка, что сообщение уже отправлено, повторять не надо. При этом этот флаг должен удаляться, если в таблице появиться хоь одна строка для работы
 
  • Оценить
Реакции: russya
я юзаю 2 способа, оба работают отлично
сначала совет:
не обозначай символами работу строки, делай нормальный статус текстовый - на много удобнее, при работе на долгосрок с кучей шабов, от сюда и логика будет правильно по итогу
сделай столбец - status
у статуса будут свои значения например
work - работает
bad - плохо выполнился
errore - с ошибкой
done - все ок
и тп

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

второй варик, если у тебя много шаблонов в потоке и надо отслеживать работу, а потом оповещать, то лучше это почитай тогда
https://zennolab.com/discussion/thr...kak-avtomatizirovat-neskolko-shablonov.53582/

если вкратце, то просто отдельный шаб запускаешь раз в минуту, и тот проверяет работает шаб или нет, и там уже принимает решение
 
  • Оценить
Реакции: russya
Вариант backoff + mysql бд , по завершению каждый поток делает запрос в бд, на подобии
SELECT COUNT (id) from table test WHERE status = end,
если запрос отдаёт больше 0, то по ветке завершаешь работу потока.
Если отдал ноль значит все потоки отработали и по второй ветке шлёшь сообщение в телегу.
 
  • Оценить
Реакции: russya
Вернет 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;
 
Всем привет! есть таблица. Беру строку ставлю + это значит что строка в работе, когда сделал все что нужно, сохраняю изменения в эту строку и ставлю +- это значит что закончил работу. Потом смотрю след. строку, но только игнорирую + и +- и так до конца таблицы. В многопотоке все хорошо работает.
Но мне нужно с 1 потока отправить в телеграмм что шаблон отработал, желательно с последнего.

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

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

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