如何让机器人 运行 在 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()
不幸的是,这也阻止了我的整个代码。我需要一些不会阻塞我代码其他部分的东西。怎么做?
我们可以使用
在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)
您可以使用 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())
我希望机器人每天 运行 一个定义的函数。我做了一些研究然后我能够写这个:
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()
不幸的是,这也阻止了我的整个代码。我需要一些不会阻塞我代码其他部分的东西。怎么做?
我们可以使用
在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)
您可以使用 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())