Перейти к содержимому
Документация
Конструктор модулей

Потоки и аккаунты

Как модуль Multogram работает в несколько потоков: что такое поток, как раздать аккаунты потокам без повторов, когда задача модуля заканчивается, общие и локальные данные, журнал и статистика задачи, параллельный запуск функций.

Модуль запускается как задача: пользователь заполняет форму модуля, выбирает число потоков и запускает. Каждый поток выполняет функцию Main с начала, независимо от других. Поэтому сценарий модуля пишут так, чтобы каждый поток брал свою часть работы.

Что такое поток

Поток — один независимый проход по сценарию. У каждого потока свои локальные переменные и своя сессия Telegram, поэтому потоки не мешают друг другу. Ошибка в одном потоке завершает только его — остальные работают дальше. Ресурсы — значения формы — у всех потоков общие.

Как раздать аккаунты потокам

Выбранные аккаунты приходят в ресурс accounts одним списком, общим для всех потоков. Чтобы два потока не взяли один аккаунт, поток забирает аккаунт из списка действием Получить значение ресурса с параметром Взять элемент списка: элемент удаляется из списка и отдаётся только этому потоку.

Шаблон нового модуля уже делает это в функции Main:

Получить значение ресурса   accounts · First item        → [[account]]
WHILE  [[account]] != ""
  TRY    Вызвать функцию  ProcessAccount ([[account]])
  CATCH  Добавить лог     «[[account]].phone: ошибка — [[_error]]»
  Получить значение ресурса   accounts · First item      → [[account]]

Каждый поток работает, пока в списке есть аккаунты, а потом завершается сам. Так модуль корректно работает при любом числе потоков: если потоков меньше, чем аккаунтов, каждый обработает несколько. Свою работу с аккаунтом добавляйте в функцию ProcessAccount — см. Первый модуль. Тот же приём подходит для любого общего списка — целей, ссылок, строк файла.

Когда задача модуля заканчивается

Как заканчивается задача, задаёт окно Потоки конструктора. Модуль, в котором режим не выбирали, проходит один раз в каждом потоке: задача завершается, когда каждый поток закончил функцию Main. Поток, завершившийся с ошибкой, заново не запускается: аккаунты, которые он не успел взять, заберут другие потоки.

Отсюда правило для своего сценария: Main должна работать, пока есть работа, а не обрабатывать один аккаунт и заканчиваться.

Другой режим можно выбрать в любом модуле:

РежимКогда задача заканчивается
НепрерывноТолько при ручной остановке: поток, который закончил Main, запускается снова
Один проходКогда каждый поток один раз прошёл Main
Число запусковПосле N прогонов Main на все потоки вместе
До N успешныхКогда N прогонов закончились успешно

Остановить после ошибок добавляется к любому режиму и завершает задачу после N неудачных прогонов.

Пока поле accounts показано, окно Потоки рекомендует Один проход: аккаунты раздаются один раз, и перезапущенный поток свободных уже не найдёт. Другой режим подходит модулю, который на каждом проходе обходит все аккаунты, не забирая их из списка, или модулю без аккаунтов — с полем accounts, скрытым из формы. Задача в Multogram завершается так же, как запуск кнопкой Запустить в предпросмотре конструктора.

Модуль, который должен работать до ручной остановки (например, следить за чатом), либо крутит цикл внутри Main и не выходит из него, либо работает в режиме Непрерывно.

Данные потоков

ЗадачаЧем решать
Данные одного аккаунтаЛокальные переменные — Установить переменную, результаты действий
Общий счётчик для всех потоковУстановить глобальную переменную, Увеличить глобальную переменную
Цифры для пользователя: отправлено, ошибок, обработаноМодуль Статистика — индикаторы общие для всех потоков
Что происходит в задачеДобавить лог из модуля Логгер — строки видны в журнале задачи
Номер потока, его статус и данныеМодуль Потоки
Завершить поток успехом или ошибкойЗавершить поток, Завершить поток с ошибкой

Сессия — внутри потока

Входите в аккаунт и работайте с ним в одном потоке, а после работы закрывайте сессию действием Destroy Session. Тогда потоки не перехватывают чужие сессии, а сбой одного аккаунта не задевает другие.

Параллельные функции внутри потока

Модуль Задачи запускает функцию в отдельном потоке и не ждёт её завершения — например, чтобы проверить несколько каналов одновременно.

ДействиеЧто делает
Запустить задачуЗапускает функцию в новом потоке, возвращает ID задачи
Ожидать результатЖдёт завершения задачи (с таймаутом) и получает её результат
Проверить завершение, Получить статус задачиУзнать, закончилась ли задача, не дожидаясь её
Отменить задачуОстановить задачу

Для обычной работы с аккаунтами это не нужно: потоки модуля уже работают параллельно.

Рекомендации

  • Один поток — один аккаунт в каждый момент. Не используйте одну сессию из нескольких потоков.
  • Паузы — в ресурсы. Задержку между действиями Telegram выносите в поле формы, чтобы пользователь подбирал её под свои аккаунты — см. Ограничения Telegram.
  • Пишите в журнал. Короткая строка на каждый аккаунт — «отправлено», «не удалось войти» — сильно упрощает поиск проблем у пользователя.

Обновлено

Файлы cookieПолитика конфиденциальности

Необходимые cookie обеспечивают работу сайта. С вашего согласия — также аналитические, чтобы улучшать сайт, и маркетинговые, чтобы учесть, кто вас пригласил. Выбор можно изменить в любой момент.