Для aiogram 2.25.1 я решил этот вопрос через добавление и удаление задач и глобальные переменные. Возможно, костыли, но работает. В данном случае будет запускаться только одна задача, которая проверяется флагом is_running.
task = Future()
is_running = False
async def infinite_loop():
counter = 0
while True:
await asyncio.sleep(1)
print(counter)
counter += 1
@dp.message_handler(text='вкл/выкл код')
async def all_message(message: types.Message):
global task, is_running
if message.from_user.id == int(ADMIN_ID):
if is_running:
await bot.send_message(message.from_user.id, "Код уже запущен")
else:
await bot.send_message(message.from_user.id,
"Код запущен, если вы хотите отключить код, то нажмите /off")
# Создаем задачу
is_running = True
task = asyncio.create_task(infinite_loop())
# Добавляем в пул для выполнения
await asyncio.gather(task)
@dp.message_handler(commands=['off'])
async def off_command(message: types.Message):
global is_running
if message.from_user.id == int(ADMIN_ID):
if is_running:
await bot.send_message(message.chat.id, "Код был остановлен")
# Отменяем задачу
task.cancel()
is_running = False
# Убираем из пула выполнения
await asyncio.gather(task)
else:
await bot.send_message(message.chat.id, "Код еще не запущен")
executor.start_polling(dp, skip_updates=True)
Если вам нужно запустить несколько задач (одинаковых или нет) через команду вкл/выкл, просто удалите этот флаг и все проверки, связанные с ним. В этом случае проблема будет только с завершением более 1 задачи. Если нужно будете, напишите сюда.