Задача - Как создать нормальный глобальный счётчик для многопоточного проекта?

Blazelip

Client
Регистрация
01.05.2016
Сообщения
99
Благодарностей
5
Баллы
8
Добрый день, Коллеги
Я думаю, у многих начинающих и не очень начинающих пользователей Зеннопостера возникает такой вопрос. Это дошло и до меня, пошерстил форум, и вроде почти нашёл решение, но оно всё равно кривое, теперь к делу.

Занимаюсь рассылками, нужна реализация следующей логики: потоки делают 1000 сообщений, далее нужно чтобы один из всех поток делал отправку на проверочную почту (самому себе), проверял доставку в "инбокс" и если всё успешно, то работа продолжалась дальше, т.е. потоки снова начали отправлять следующую 1000 сообщений.

Изначально логично было подступиться к глобальным переменным, но прочитав форум понял, что с ними багов предостаточно, к тому же потоки могут случайно одновременно лезть к переменной, ещё больше напрягся из-за предстоящей запары. Далее пришла костыльная идея, опять же с форума, про общий список на проект (Вложение 1), сделал список, привязанный к файлу, с цифрами от 1 до 1000, логика следующая: каждый проект после отправки сообщения берёт число из списка с удалением, начиная с 1, как только список заканчивается, он сразу же пополняется вновь числами от 1 до 1000 (чтобы другие потоки не залезли в красную ветку), а затем активируется проверочная логика, посредством установки "1" переключателю логики (простая отправка/отправка себе-проверочная)

Вопрос.PNG

И вроде бы костыль работает, то есть один поток обнаруживает, что список-счётчик пуст, пополняет список, активирует проверочную логику и делает проверочную отправку, проверяет, но есть проблема: остальные потоки продолжаюбт работать, ведь общий список уже пополнился сразу после того, как он был замечен пустым, а если письмо не дошло, то по логике должна быть "стоп-машина", но на деле всё иначе. Если убрать это пополнение списка в конец, т.е. поток проверил доставку и только поток дал старт другим потокам работать, то их нужно как-то занять, чтобы они не упали.

Следственно, нужно придумать что-то, чтобы в случае если проверка показало, что письмо не дошло, то:
1) Все потоки останавливали свою работу и в Зенно нельзя было добавить новые попытки выполнения.
2) Либо сделать так, чтобы 1 поток делал проверку, все остальные простаивали, как только проверка прошла, работа потоков продолжалась.

Но мне что-то в голову уже ничего не лезет, может кто-то всё-таки "дободался" с этой темой до нормального решения? Глобальные переменные или всё-таки костыль?
 
Последнее редактирование:

grin-du

Client
Регистрация
09.10.2017
Сообщения
96
Благодарностей
46
Баллы
18
Как вариант, если потоки берут из одного файла, то можно, когда он будет пуст по красной ветке идет пауза (нужно смотреть сколько), далее тот поток которому упало 1000-ая строка отправляет и ждет письма, если приходит письмо, то ОН ЖЕ и делает заполнение списка номерами, примерно через несколько времени к нему подключатся остальные*? Не могу спорить, что может быть что-то более практичней!
 

Blazelip

Client
Регистрация
01.05.2016
Сообщения
99
Благодарностей
5
Баллы
8
Как вариант, если потоки берут из одного файла, то можно, когда он будет пуст по красной ветке идет пауза (нужно смотреть сколько), далее тот поток которому упало 1000-ая строка отправляет и ждет письма, если приходит письмо, то ОН ЖЕ и делает заполнение списка номерами, примерно через несколько времени к нему подключатся остальные*? Не могу спорить, что может быть что-то более практичней!
Честно говоря, не совсем понял, могли бы расписать по шагам немного подробнее?
 

grin-du

Client
Регистрация
09.10.2017
Сообщения
96
Благодарностей
46
Баллы
18
Честно говоря, не совсем понял, могли бы расписать по шагам немного подробнее?
Как вариант, если потоки берут из одного файла (общий список на проект (Вложение 1)), то можно, когда он будет пуст (все строки разберут), то по красной ветке идет пауза (нужно смотреть сколько по времени необходимо, чтобы дождаться письма), далее тот поток которому упало 1000-ая строка отправляет и ждет письма (то что нужно чекнуть на инбокс), если приходит письмо, то ОН ЖЕ и делает заполнение списка номерами (опять 1000, и начинает слать далее), примерно через несколько времени (к моменту истечения паузы остальные потоки начинают так же отправлять и обращаются к этому списку беря строки). И так далее. Если же письмо не пришло, то сам знаешь чего. Не могу спорить, что может быть что-то более практичней!
 

Severip

Client
Регистрация
17.10.2013
Сообщения
346
Благодарностей
98
Баллы
28
У меня сделана пауза в цикле с проверкой нужного условия. Ставлю этот блок везде, где критично прерывание проекта.
 
  • Спасибо
Реакции: grin-du

budora

Client
Регистрация
13.08.2012
Сообщения
831
Благодарностей
556
Баллы
93
При старте проверяем глобальную переменную на наличие и если нет устанавливаем 0 и сразу увеличивая ее. При переменной равной 1000 запуск вложенного шаблона и делаем проверочную отправку со сбросом или нет до 1 в зависимости от результата, для получивших переменную больше 1000 пауза на N минут и цикл по окончании паузы на N раз если переменная не была сброшена до 1 то после цикла пауз гуд или бэд ..решите сами.
 
  • Спасибо
Реакции: lbvf65 и Blazelip

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