2009-06-07 3 views
1

this recipe에서 무슨 일이 일어나고 있는지 머리를 감싸려고합니다. wx/twisted app (즉, wx 및 twisted 별도의 스레드에서 실행). 트위스트 및 wx 이벤트 루프 모두 thread-safe 방식 (즉, reactor.callFromThread, wx.PostEvent 등)으로 액세스해야한다는 것을 알고 있습니다. 내가 궁금해하는 것은 객체의 인스턴스 메소드를 하나의 스레드 (이 기법의 경우 GUI 스레드)에서 인스턴스화 된 객체 메소드를 지연 콜백 및 별도의 스레드에서 실행되는 원자로에 대한 errBack 메소드로 전달하는 스레드 안전성입니다. 그거 좋은 생각이야?인스턴스 메서드는 인스턴스화 스레드가 아닌 별도의 스레드에서 호출되었습니다.

왜곡 된 형태로 사용할 수있는 wx 반응기가 있지만 인터넷에 소개 된 이래로 수많은 문제가있는 것으로 나타납니다. 처음에는 wxreactor 기술, advocates running wx and twisted in separate threads이 등장했습니다.

이 기술에 대한 다른 예제를 찾을 수 없었지만 일부를보고 싶습니다.

답변

0

나는 그것이 "좋은 생각"이라고 말하지 않을 것입니다. Wxreactor를 사용하여 동일한 스레드에서 원자로와 GUI를 실행해야합니다.

슈뢰더 (Schroeder)가 설명한 타이머 구동 이벤트 루프 배제 방법은 이벤트 루프 통합을 구현하는 최악의 오류 방지 방법입니다. wxreactor (wxsupport이 아님)을 사용하는 경우 이제 Twisted는 멀티플렉싱이 스레드를 내부적으로 차단하여 타이머를 사용할 필요가없는 방식을 사용합니다. 더 나은 것은 wxpython이 wxSocket을 노출시키고 다른 누군가가 그것에 반응기를 갖게하는 것입니다.

그러나 Twisted와 통신하기 위해 별도의 스레드를 사용하도록 설정 한 경우 값으로 Deferred.callback으로 전달하려는 임의의 스레드에서 시작된 개체를 사용할 수 있지만, Deferred.callback으로 전화해야합니다. 지연은 스레드 세이프가 아닙니다. 일부 디버깅 유틸리티 덕택에 Deferred클래스도 스레드 안전하지 않으므로 Twisted 메인 스레드를 떠나지 않을 때 매우주의해야합니다. UI 스레드에 결과가있는 경우 reactor.callFromThread(myDeferred.callback, myresult)을 사용하십시오.

0

스레드간에 인스턴스 메서드를 전달하는 유일한 행위는 해당 인스턴스의 최종 파괴를 적절하게 동기화하는 것만 큼 안전합니다 (스레드는 메모리를 공유하므로 어느 스레드가 메모리를 할당/초기화했는지는 중요하지 않습니다) .

전반적인 스레드 안전성은 실제로 수행되는 방법에 따라 달라 지므로 "안전함"을 나타내려면 확인해야합니다.

관련 문제