如何使Bot每天在特定时间在discord.py中运行定义的功能?

时间:2020-10-02 15:10:41

标签: python discord discord.py schedule

我希望机器人每天运行定义的功能。我做了一些研究,然后写出了这个:

def job():
    print("task")
    
schedule.every().day.at("11:58").do(job)

while True:
    schedule.run_pending()
    time.sleep(1)

但是此代码阻止了所有其他功能,因此我从其他堆栈溢出答案中进行了更多研究,然后我能够编写出以下代码:

def job():
    print('hi task')

def threaded(func):
    job_thread = threading.Thread(target=func)
    job_thread.start()

if __name__=="__main__":

    schedule.every().day.at("12:06").do(threaded,job)      
    while True:
        schedule.run_pending()

不幸的是,这也阻塞了我的整个代码。我需要一些不会阻塞代码其他部分的东西。该怎么做?

2 个答案:

答案 0 :(得分:1)

您可以使用asyncio轻松设置它

def job():
    print("task")
    
schedule.every().day.at("11:58").do(job)

async def task():
    while True:
        schedule.run_pending()
        await asyncio.sleep(1)

,而且您也不要忘记在on_ready事件上添加client.loop.create_task(task())

@client.event
async def on_ready():
    client.loop.create_task(task())

答案 1 :(得分:0)

我们可以通过以下方式在discord.py中循环一个函数

client.loop.create_task(function())

因此,我们可以每秒检查一次时间或10-15秒。

import datetime
async def function():

    schedule_time = datetime.datetime(2020, 10, 3, 11, 58, 00, 000000)#(year, month, day, hour, minute, second, microsecond)
    await client.wait_until_ready()

    while not client.is_closed():
       now = datetime.datetime.now()
       if schedule_time  <= now:
           #JOB
           #add one day to schedule_time to repeat on next day
           schedule_time+= datetime.timedelta(days=1)
       await asyncio.sleep(20)

client.loop.create_task(function())

首先在schedule_time变量中设置日期和时间,在while语句中,它每20秒检查一下schedule_time是否满足或超过了当前时间!如果这样做,它将执行#JOB段,完成作业段后,我们应该将schedule_time变量更新到第二天!否则它将永远循环。因此,借助DateTime模块,我们在此行的末尾更新了schedule_time变量!

schedule_time+= datetime.timedelta(days=1)