簡體   English   中英

如何讓機器人每天在特定時間在 discord.py 中運行定義的函數?

[英]How to make the bot run a defined function at a specific time everyday in discord.py?

我希望機器人每天運行一個定義的函數。 我做了一些研究,然后我能夠寫出這個:

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()

不幸的是,這也阻塞了我的整個代碼。 我需要一些不會阻塞我代碼其他部分的東西。 怎么做?

您可以使用 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())

我們可以在 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM