基于异步函数的threading.Timer的使用

问题描述:

我正在使用Python处理一个Discord bot,它将来自YouTube的音乐排队,我正在处理某些事情以便在播放器停止时自动化歌曲,同时所有代码都可以工作完美,唯一的问题是我不能够检查,如果玩家玩或不每隔15秒基于异步函数的threading.Timer的使用

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

我没有意识到

threading.Timer(15.0,await self.cmd_autoqueue(message, player,channel,author, permissions, leftover_args)).start() 

调用函数,如果我想通过它作为将被称为后来我会使用lambda:但是,异步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) 

你可以使用loop.call_later,即返回一个asyncio兼容的处理程序来取消任务。

类YourClass: DEF 初始化(个体): self._loop = asyncio.get_event_loop() self._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来绑定参数。