728x90
RuntimeError: cannot run the event loop in a non-main thread
오류는 비동기 코드(asyncio
)를 메인 스레드가 아닌 서브 스레드에서 실행하려고 할 때 발생합니다. asyncio.run()
또는 loop.run_until_complete()
와 같은 함수는 기본적으로 메인 스레드에서만 안전하게 실행되도록 설계되어 있습니다.
이 오류는 GUI 애플리케이션(PyQt, Tkinter 등), Jupyter Notebook, 또는 백그라운드에서 동작하는 스레드 내에서 비동기 루프를 실행하려 할 때 자주 발생합니다. 스레드 구조를 명확히 구분하거나, 스레드 안전한 방식으로 이벤트 루프를 다뤄야 합니다.
● 오류 발생 예시
import asyncio, threading
def run():
asyncio.run(asyncio.sleep(1))
threading.Thread(target=run).start()
이 코드는 서브 스레드에서 asyncio.run()
을 실행하려고 하므로 RuntimeError
가 발생합니다.
RuntimeError: cannot run the event loop in a non-main thread
● 해결 방법
- 이벤트 루프는 메인 스레드에서 실행하도록 구조 변경
- 비동기 함수를 서브 스레드에서 실행하고 싶다면
loop.call_soon_threadsafe()
또는asyncio.run_coroutine_threadsafe()
사용 - 스레드 내부에서 별도 이벤트 루프를 생성하고 설정
● 예시 코드 (해결 방법)
import asyncio, threading
def run():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(asyncio.sleep(1))
threading.Thread(target=run).start()
● 자주 하는 실수
- 백그라운드 스레드에서 asyncio 루프를 직접 실행
- Jupyter 등 메인 루프가 이미 실행 중인 환경에서
asyncio.run()
재호출 - GUI 콜백에서 비동기 코드를 직접 호출
● 결론
RuntimeError - cannot run the event loop in a non-main thread
오류는 asyncio 이벤트 루프가 잘못된 스레드에서 실행되었을 때 발생합니다. 비동기 코드와 스레드의 구분을 명확히 하고, 루프 제어는 항상 안전한 방식으로 처리해야 합니다.
728x90
'프로그래밍언어 > 파이썬[Error]' 카테고리의 다른 글
[파이썬][Error] 075. RuntimeError - cyclic dependency detected (0) | 2025.05.30 |
---|---|
[파이썬][Error] 074. RecursionError - infinite recursion with no base case (0) | 2025.05.30 |
[파이썬][Error] 072. RuntimeError - dictionary changed size during iteration (0) | 2025.05.30 |
[파이썬][Error] 071. RuntimeError - Event loop is closed (0) | 2025.05.30 |
[파이썬][Error] 070. ValueError - generator already executing (0) | 2025.05.30 |