2017-03-05 2 views
2

파이썬이있는 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)를 사용할 것입니다. 그러나 비동기 람다 (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) 

답변

0

당신은 loop.call_later을 사용할 수 있습니다, 그 :

또한 부울

솔루션이 질문에 여기의 '만약'을 위해 자사가 너무 다른 물건에 의해 관리 시작 작업을 취소하기 위해 asyncio 호환 핸들러를 반환합니다.

클래스 YourClass : DEF INIT (자기) 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을 사용하여 매개 변수를 바인딩 할 수 있습니다.