728x90
ValueError: generator already executing
오류는 제너레이터(generator) 내부에서 자신을 다시 호출하거나, 아직 완료되지 않은 상태에서 동시에 여러 번 접근할 때 발생합니다. 파이썬의 제너레이터는 한 번에 하나의 실행 흐름만 처리할 수 있기 때문에, 중첩 호출이나 병렬 호출이 있을 경우 이 오류가 발생합니다.
이 오류는 주로 yield
를 사용한 반복 구조에서, 제너레이터 객체를 순회하는 중에 같은 제너레이터를 다시 호출하거나 next()
를 동시에 여러 스레드에서 사용할 때 나타납니다.
● 오류 발생 예시
def recursive_gen():
yield from recursive_gen()
for _ in recursive_gen():
pass
자신을 재귀적으로 호출하는 제너레이터는 generator already executing
오류를 유발합니다.
ValueError: generator already executing
● 해결 방법
- 제너레이터 내부에서 자기 자신을 호출하지 않도록 구조 변경
- 멀티스레드 환경에서는 락(lock) 등으로 동시 접근 방지
- 중첩 반복문에서 제너레이터를 다시 호출하지 않도록 주의
● 예시 코드 (정상적인 사용)
def simple_gen():
for i in range(3):
yield i
for val in simple_gen():
print(val)
● 자주 하는 실수
- 제너레이터 내부에서
yield from self
또는 유사한 구조 사용 - 복수의 쓰레드에서 동일 제너레이터 객체를 공유
- 순회 중인 제너레이터를 다른 루프에서 재사용
● 결론
ValueError - generator already executing
오류는 제너레이터가 동시에 두 번 이상 실행되었을 때 발생합니다. 제너레이터의 단일 실행 흐름 원칙을 지키고, 복잡한 호출 구조에서는 재귀나 다중 접근을 피하는 것이 중요합니다.
728x90