使用线程。计时器使用基于异步的函数

2024-09-30 04:38:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在用Python开发一个Discord bot,它将YouTube上的音乐排队,我正在研究在播放器停止时自动对歌曲进行排队的方法,而所有的代码都能完美地工作,唯一的问题是我不能每隔15秒检查一下播放器是否正在播放

    async def cmd_autoqueue(self,message, player,channel,author, permissions, leftover_args):

     print("autoq ran")
     if started == True:

       if player.is_stopped:
         await self.cmd_autoqadd(player, channel, author, permissions,leftover_args,song_url=last_url)
       threading.Timer(15.0,await self.cmd_autoqueue(message, player,channel,author, permissions, leftover_args)).start()  

我确实意识到了

^{pr2}$

调用函数,如果我想把它作为以后调用的函数传递,我会使用lambda:但是,async lambda?在

同样开始布尔值是由其他东西来管理的,所以它在这里是为了“如果”,在这个问题中

解决方案:

    async def cmd_autoqueue(self,message, player,channel,author, permissions, leftover_args):
    global started
    print("loop")
    if started == True:
       await asyncio.sleep(15) 
       if player.is_stopped:
         await self.cmd_autoqadd(player, channel, author, permissions,leftover_args,song_url=last_url)
       await self.cmd_autoqueue(message, player,channel,author, permissions, leftover_args)

Tags: selfcmdurlpermissionsmessageasyncifchannel
1条回答
网友
1楼 · 发布于 2024-09-30 04:38:28

你可以利用loop.call\u稍后,返回一个异步兼容处理程序以取消任务。在

你的班级: definit(自身): 自循环=asyncio.get_event_循环() self.\u check_handler=无

def schedule_check(self):
    self._check_handler = loop.call_later(
        15 * 60,  # Every 15 minutes
        self._loop.create_task, self._periodic_check())

def stop_checking(self):
    self._check_handler.cancel()    

async def start_player(self):
    await do something()
    if not check_handler:
        schedule_check()

async def stop_player(self):
    await do something()
    self.stop_checking()

async def _periodic_check(self):
    await do_something()
    self._schedule_check()

要将一个函数(需要一些参数)作为参数传递给另一个不允许传递参数的函数,可以使用functools.partial. 在

相关问题 更多 >

    热门问题