파이썬 - RuntimeError: dictionary changed size during iteration
파이썬의 dictionary는 스레드 안전하지 않은 자료 구조입니다. 그런 탓에 서로 다른 스레드에서 접근하는 경우 예외가 발생할 수 있는데요, (닷넷과는 다르게) 단지 요소의 값을 업데이트하는 것에는 예외가 발생하지 않습니다. 즉, 일례로 다음의 코드는 오류가 발생하지 않습니다.
import threading
import time
def enum_dict(d):
for k, v in d.items(): # 스레드에서 열거
print(k, v)
time.sleep(5)
t = {1: 1}
threading.Thread(target=enum_dict, args=(t,)).start()
t[1] = 100 # 다른 스레드에서는 값을 (추가가 아닌) 업데이트
하지만, 크기를 변경하는 경우라면 RuntimeError를 발생시킵니다.
t[100] = 100 # dictionary에 새로운 항목 추가
# 예외 발생
Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Python38\lib\threading.py", line 932, in _bootstrap_inner
self.run()
File "C:\Python38\lib\threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "C:\pycharm\work\testconsole\main.py", line 6, in enum_dict
for k, v in d.items():
RuntimeError: dictionary changed size during iteration
(내부 소스 코드를 확인하진 않았지만) 아마도 항목을 추가/삭제하는 경우에는 내부 bucket 구조의 재배치가 발생할 수 있으므로 이에 대해 차단하려는 목적이었을 것입니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]