如何使用计划库运行异步功能?

我正在使用discord.py rewrite编写一个discord机器人,我想每天在特定时间运行一个函数。我完全没有异步函数的经验,我不知道如何在不使用“等待”的情况下运行一个异步函数。这只是我的代码的一部分,这就是为什么可能未定义某些内容的原因。


async def send_channel():

    try:

        await active_channel.send('daily text here')

    except Exception:

        active_channel_id = None

        active_channel = None


async def timer():

    while True:

        schedule.run_pending()

        await asyncio.sleep(3)

        schedule.every().day.at("21:57").do(await send_channel())


@bot.event

async def on_ready():

    print("Logged in as")

    print(bot.user.name)

    print(bot.user.id)

    print("------")


    bot.loop.create_task(timer())

使用该schedule.every().day.at("00:00").do()函数时,输入await send_channel()以下参数会出现此错误.do():

self.job_func = functools.partial(job_func,* args,** kwargs)TypeError:第一个参数必须是可调用的

但是,当我不使用await并将其send_channel()作为参数时,会出现此错误:

RuntimeWarning:从未等待协程'send_channel'

我不是很擅长编程,所以如果有人可以尝试为我愚弄它,那就太好了。


海绵宝宝撒
浏览 138回答 3
3回答

GCT1015

另一个选择是使用apscheduler的AsyncIOScheduler,它与异步功能(例如send_channel)配合使用更为自然。就您而言,您可以简单地编写以下形式的内容:scheduler = AsyncIOScheduler()scheduler.add_job(send_channel, trigger=tr)scheduler.start()tr触发对象在哪里。您可以使用IntervalTrigger1天的时间间隔和21:57的开始日期,也可以使用CronTrigger。请注意,在程序结束时,建议调用shutdown()调度程序对象。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python