2016-09-02 3 views
1

전역 변수를 파일에 저장해야하는 프로그램이 있습니다. 나는 pickle 모듈을 사용하여 이것을하고있다.스레드간에 객체를 공유 할 때 산세 오류를 피하는 방법은 무엇입니까?

나는 종종 글로벌 변수의 값을 변경하는 또 다른 thread (데몬 = False, threading 모듈로부터)을 가지고있다. 이 값은 전역 범위 (기본 프로그램)에서 수정됩니다.

.pkl 파일에 변수 값을 매 5 초마다 덤프합니다 (다른 threadthreading 모듈에서 사용).

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). 
+1

다른 스레드에서 현재 보유하고있는 운영 체제/세마포의 현재 상태에 연결되어 있기 때문에 잠금 개체를 피클링 할 수 없습니다. –

+0

직접 또는 간접적으로 잠금을 참조하는 유형의 피클 링을 원한다면 직접 ['__getstate__'] (https://docs.python.org/2/library/pickle.html#object.__getstate__)을 구현해야합니다.) 메소드를 호출합니다. 자물쇠가 풀려나는지 여부는 중요하지 않습니다. –

+0

그러나 대상 함수가 종료되면 남아있는 스레드가 하나뿐이므로 잠금이 해제되지 않아야합니까? 또한 예제 코드를 제공 할 수 있다면 실제로 도움이 될 것입니다. –

답변

0

, 당신은 "휘발성"엔티티 (스레드, 연결, 개시 또는 종료 이벤트들이 발생 프리미티브 등) 피클 수 없습니다.

당신이하려는 것은 세션을 저장하고 나중에 세션을 계속할 수 있도록하는 것입니다. 그 일을 위해서, 성격 상 저장할 수없는 물건을 구하기 위해 할 수있는 일은 아무것도 없습니다.

가장 간단한 해결책은 무시하는 것입니다. 누락 된 변수가 어쨌든 오류를 발생시키기 때문에 (변수를 마스킹하는 경우에는 오류가 발생하지 않지만 그 자체로는 의문스러운 실행입니다.)).

또는 세션을 복원 할 때 이러한 개체를 새로 설정할 수도 있습니다. 그러나 그러한 논리는 필요에 따라 작업에 따라 다릅니다.

마지막으로, 예를 들어. IPython already has session saving/restoration logic, 그래서 당신은 아마 전혀 바퀴를 재발견 할 필요가 없습니다.

+0

ipython의 세션 논리에 좀 더 구체적으로 설명 할 수 있습니까? 또한 이러한 휘발성 변수를 데이터베이스에 저장할 수 있습니까? –

+0

첫 번째 : 완료, 두 번째 : 직렬화의 요점과 "영구 데이터로 이해하지 못하는 부분"을 얻었습니까? –

관련 문제