Как заставить фоновую задачу выполняться только при выполнении определенного условия? - PullRequest
0 голосов
/ 25 января 2019

Фоновая задача не выполняется в следующем фрагменте кода.

global bt2
bt2='False'

bot = commands.Bot(command_prefix=!)

@bot.command(pass_context=True)
async def autopurge(ctx,time):
        global bt2, bt2_time, bt2_chid
        bt2='True'
        if int(time)==0:
            bt2='False'
        bt2_time=int(time)
        bt2_chid=ctx.message.channel.id

async def background_task_2():
    global bt2, bt2_time, bt2_chid
    print(bt2, bt2_time, bt2_chid)
    async for msg in bot.logs_from(bt2_chid):
        await bot.delete_message(msg)
    await asyncio.sleep(bt2_time)


while bt2=='True':
    bot.loop.create_task(background_task_2())

Она не удаляет ничего.Я хочу, чтобы он удалял сообщения в канале каждые пару секунд.

1 Ответ

0 голосов
/ 25 января 2019

Когда python компилирует ваш код, он выполняет весь скрипт один раз, поэтому ваш

while bt2=='True':
    bot.loop.create_task(background_task_2())  

запускается и, поскольку bt2='False' в начале, он не будет запускать цикл while.

Что вы хотите сделать вместо этого, если что-то вроде этого

global bt2
bt2='False'
purging_task = None

bot = commands.Bot(command_prefix=!)

@bot.command(pass_context=True)
async def autopurge(ctx,time):
  global bt2, bt2_time, bt2_chid,purging_task
  bt2='True'
  if int(time)==0:
    purging_task.cancel()
  elif not(purging_task):
    bt2_time=int(time)
    bt2_chid=ctx.message.channel.id
    purging_task = bot.loop.create_task(background_task_2())

async def background_task_2():
    global bt2, bt2_time, bt2_chid
    while True:
      print(bt2, bt2_time, bt2_chid)
      async for msg in bot.logs_from(bot.get_channel(bt2_chid),limit=5):
        await bot.delete_message(msg)
    await asyncio.sleep(bt2_time)

Где бы вы запускали задачу, когда вы хотите запустить и иметь цикл while внутри этой задачи, и когда вы хотите закрыть ее, просто запустите Task.cancel()

Также

async for msg in bot.logs_from(bt2_chid):
    await bot.delete_message(msg)

не работает, поскольку bot.logs_from принимает канал в качестве аргумента, а не его идентификатор

...