如何解决如何使Bot每天在特定时间在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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。