后台任务在discord.py

时间:2019-07-19 01:13:27

标签: python discord discord.py

我正在Linux Mint上使用Discord.py进行操作,我想使用后台任务,但似乎无法使它们正常工作。显然出于某种原因甚至都没有进入while循环(见下文)。

我尝试了许多非常基本的后台任务示例,但是没有任何效果,除了不和谐之外,py正常工作,并且我可以做很多事情,使其完美运行。 即使while循环中的print语句也没有显示出来,这很奇怪。

import discord
import asyncio

TOKEN = '<my-token>'

client = discord.Client()

async def my_background_task():
    await client.wait_until_ready()
    print("I am showing up!")
    while not client.is_closed:
        print("I am not showing up!")
        servers = client.get_all_servers()
        for server in servers:
            for channel in server.channels:
                await client.send_message(channel, "Some message")
        await asyncio.sleep(1) # task runs every second

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

client.loop.create_task(my_background_task())
client.run(TOKEN)

因此,该机器人可以正常启动,如果我要使用on_message方法,它将可以正常工作(我没有添加它,因为它无关紧要)。但是后台任务由于某种原因从未完成。甚至没有显示一条错误消息。好像后台任务被忽略了。我在Google上进行了搜索,但似乎没有人遇到此问题。

编辑:已解决。尽管我发现所有在线示例均未使用任何括号,但client.is_closed之后仍缺少一对括号。

1 个答案:

答案 0 :(得分:0)

"@tasks.loop(seconds = 1)" 表示循环每 X 秒重复一次。
您可以使用“@tasks.loop()”来定义循环,使用“(seconds = 1)”来定义循环重复多少秒后。
要开始循环,你需要添加“my_background_task.start()”,这意味着后台任务是启动的。

您可以添加 my_background_task.start() 作为命令:

@bot.command()
async def mybgtask(ctx):
    my_background_task.start()
    await ctx.send("my_background_task loop has started")

代码如下:

import discord
import asyncio
from discord.ext import tasks

TOKEN = '<my-token>'

client = discord.Client()


@tasks.loop(seconds = 1) #The loop repeats every 1 seconds
async def my_background_task():
    await client.wait_until_ready()
    print("I am showing up!")
    if not client.is_closed:
        print("I am not showing up!")
        servers = client.get_all_servers()
        for server in servers:
            for channel in server.channels:
                await client.send_message(channel, "Some message")

@client.event
async def on_ready():
    print('Logged in as')
    print(client.user.name)
    print(client.user.id)
    print('------')

my_background_task.start()
client.run(TOKEN)