전역 변수를 파일에 저장해야하는 프로그램이 있습니다. 나는 pickle
모듈을 사용하여 이것을하고있다.스레드간에 객체를 공유 할 때 산세 오류를 피하는 방법은 무엇입니까?
나는 종종 글로벌 변수의 값을 변경하는 또 다른 thread
(데몬 = False
, threading
모듈로부터)을 가지고있다. 이 값은 전역 범위 (기본 프로그램)에서 수정됩니다.
.pkl
파일에 변수 값을 매 5 초마다 덤프합니다 (다른 thread
을 threading
모듈에서 사용).
TypeError: can't pickle _thread.lock objects
왜 이런 일이 :
그러나
나는dump
메서드가 실행되었을 때 다음과 같은 오류를 발견? 그리고 그것을 해결하기 위해 무엇을 할 수 있습니까?
참고 : multiprocessing
모듈과 비슷한 답변을 발견했습니다. 하지만 threading
모듈에 대한 대답이 필요합니다.
코드 : 다른 언급했듯이 그들이 의미로 영구 데이터를하지 않기 때문에
가def save_state():
while True:
global variable
lastSession = open('lastSession.pkl', 'wb')
# error occurs on this line
pickle.dump(variable, lastSession)
lastSession.close()
time.sleep(5)
state_thread = threading.Thread(target = save_state)
state_thread.setDaemon(False)
state_thread.start()
# variable is changed outside this function and also in another thread(not state_thread).
다른 스레드에서 현재 보유하고있는 운영 체제/세마포의 현재 상태에 연결되어 있기 때문에 잠금 개체를 피클링 할 수 없습니다. –
직접 또는 간접적으로 잠금을 참조하는 유형의 피클 링을 원한다면 직접 ['__getstate__'] (https://docs.python.org/2/library/pickle.html#object.__getstate__)을 구현해야합니다.) 메소드를 호출합니다. 자물쇠가 풀려나는지 여부는 중요하지 않습니다. –
그러나 대상 함수가 종료되면 남아있는 스레드가 하나뿐이므로 잠금이 해제되지 않아야합니까? 또한 예제 코드를 제공 할 수 있다면 실제로 도움이 될 것입니다. –