【问题标题】:Usage of threading.Timer with async based functions将 threading.Timer 与基于异步的函数一起使用
【发布时间】:2017-03-05 10:56:34
【问题描述】:

我正在使用 Python 开发 Discord 机器人,它可以将来自 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()  

我确实意识到了

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)

【问题讨论】:

    标签: python multithreading lambda python-asyncio


    【解决方案1】:

    您可以使用 loop.call_later,它会返回一个与异步兼容的处理程序来取消任务。

    类你的类: 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 绑定参数。

    【讨论】:

      猜你喜欢
      • 2013-08-14
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-08-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多