디스코드 오류 - Cannot close a running event loop (feat. 구글 코랩)

디스코드 서버/ 봇 설치 후, 실행하다 이 에러가 난다면?

구글 코랩 및 주피터에서 디스코드(discord.py) 실행시 겪을 수 있는 오류이다. 내 경우는, 구글 코랩에서 디스코드 봇 실행과정에서 발생했고, 다음과 같이 문제를 해결했다. 혹시나 유사한 문제를 겪을 수도 있는 누군가를 위해 기록으로 남긴다.

디스코드 봇을 설치/ 테스트 해보고자 하는데, 기본 코드를 따라 하다 보니 RuntimeError: Cannot close a running event loop라는 에러가 발생하였다. 혹시나 하여, 로컬 PyCharm에서 실행해보니 정상적으로 실행되는 코드였다.

 

문제를 일으킨 코드

디스코드 채널이 정상적으로 생성되어 있고, 그 채널에 봇이 연결만 되어 있다면 아래 코드는 정상적으로 실행된다. 맥북에서 직접 실행해 보니 정상적으로 실행되지만, 구글 코랩에서 실행하니 문제가 발생하였다.

import discord
from discord.ext import tasks

TOKEN = '토큰'
CHANNEL_ID = 채널ID

client = discord.Client()

@client.event
async def on_ready():
    send_msg.start()

    print("Hi, logged in as")
    print(client.user.name)
    print()

@tasks.loop(minutes = 5)
async def send_msg():
    channel = client.get_channel(CHANNEL_ID)
    await channel.send('Hello')

client.run(TOKEN)

이렇게 생긴 코드를 구글 코랩에서 실행시켰을 때 발생한 에러 전문은 아래와 같다.

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/discord/client.py in run(self, *args, **kwargs)
    712         try:
--> 713             loop.run_forever()
    714         except KeyboardInterrupt:

10 frames
RuntimeError: This event loop is already running

During handling of the above exception, another exception occurred:

RuntimeError                              Traceback (most recent call last)
RuntimeError: This event loop is already running

During handling of the above exception, another exception occurred:

RuntimeError                              Traceback (most recent call last)
/usr/lib/python3.7/asyncio/selector_events.py in close(self)
     86     def close(self):
     87         if self.is_running():
---> 88             raise RuntimeError("Cannot close a running event loop")
     89         if self.is_closed():
     90             return

RuntimeError: Cannot close a running event loop


 



문제를 해결한 코드

다른 블록을 열어, 아래의 코드를 먼저 실행시킨다.

!pip install nest_asyncio 
import nest_asyncio 
nest_asyncio.apply()

그리고 나서, 앞서 문제가 발생한 코드를 다시 실행시켜 보자. 그러면, 앞서 에러가 발생한 부분에서 더이상 에러가 발생하지 않고 동작하게 된다. 해당 내용은 주피터랩/주피터 노트북에서 동일한 에러가 발생할 때도 적용해 보면 될 듯 하다.

 

관련 글

 

디스코드 서버-봇 설정하기

디스코드란? 디스코드는 인스턴트 메신저 중의 하나로 음성, 채팅, 화상통화 등을 지원하는 VoIP 솔루션이다. 2015년 9월에 모바일 게임인 Fates Forever 지원하기 위해 최초 출시되었으며, 뛰어난 성

luran.me

 

디스코드 봇 준비- discord.py 설치하기 (feat 맥북, 구글 코랩)

로컬 맥북 혹은 구글 코랩에 discord.py 설치하기 파이썬용 디스코드 봇 API로, discord.py를 사용하면 손쉽게 디스코드 봇을 만들 수 있다. 파이썬이 있다는 전제가 깔려 있으므로, 맥북 로컬에 설치되

luran.me

 

구글 코랩 (Google Colab) 시작하기

구글 코랩(Google Colaboratory)은 구글에서 제공하는 Jupyter Notebook이다. 대신, 인프라는 구글 클라우드를 기반으로 하기 때문에 개개인의 PC 보다 오히려 좋은 성능 및 접근성을 제공하고 있다. (보안

luran.me

 

아나콘다(Anaconda)로 맥북에 주피터 랩/주피터 노트북 설치하기

파이썬 개발 환경을 구축하고자 아나콘다(Anaconda)를 설치하는 방법에 대해 기록한다. 사실 제목에는 아나콘다를 먼저 썼지만, 보다 맞는 제목은 아나콘다로 주피터 노트북/주피터 랩 설치하기가

luran.me

 

댓글

Designed by JB FACTORY