2009-06-25 2 views
3

시나리오 :코코아 분산 객체, 롱 폴링, launchd에 및 활동 모니터에 "응답 없음"

나는 맥 응용 프로그램과 (재단 클래스 작성)을 launchd에 데몬 사이에 분산 객체 기반 IPC 있습니다. 비동기 메시징과 관련하여 문제가 있었기 때문에 (예 : 서버의 루트 객체에 registerClient가 있고 서버의 루트 객체가 클라이언트의 프록시 객체에 메소드를 알리고 호출하는 이벤트가있을 때마다) 나는 오랫동안 폴링을 수행했는데, 클라이언트는 데몬으로부터 이벤트/통지 목록을 "수집"합니다. 이 "수확"은 NSArray 인스턴스를 반환하는 서버 객체 메서드 호출을 통해 수행됩니다.

몇 초 동안 서버 개체의 프로세스 (launchd를 통해 실행 됨) 옆에 "(응답 없음)"태그 (활동 모니터 내부)가 빨간색으로 표시되기 시작합니다. 제가 말했듯이, 기능면에서, 그것은 잘 작동하지만, 우리는이 "Not responding"라벨을 없애고 싶습니다.

"응답하지 않음"태그를 어떻게 방지 할 수 있습니까?

참고하시기 바랍니다. 이전에 launchd 기반 프로세스를 이미 수행했으며 이번에는 처음으로 롱 폴링을 수행했습니다. 또한 NSSocketPortName 기반 연결과 NSSocketPort 기반 연결도 시도했습니다. 그들은이 문제가 없었습니다. 잠금은 문제가 아니 었습니다. '사용 된 잠금 장치는 NSCondition 뿐이 었으며 우리는 프로그램을 로깅하고 디버깅했습니다. 실제로 잠겨있는 "문제"가 실제로 기능적으로 작동하는 수확 부분에있는 것처럼 보입니다. 또한 ObjC를 사용하여 서버 프로세스를 작성하는 동안 클라이언트 프로세스는 PyObjC로 작성됩니다.

미리 감사드립니다.

+1

+1 최고의 오타를 위해! 나는 "lunch daemon !!"을 좋아한다. – kent

+0

하하. 미안합니다. 어쨌든, 어쨌든 그것을 바 꾸었습니다. – jopes

답변

2

실제로 문제는 서명을 사용하여 프로세스의 PID를 가져 오는 것이 었습니다 ... FNDR ... 해당 부분에서 "응답하지 않음"오류가 발생했으며 잠금 또는 긴 폴링 부분이 없었습니다. 이 사람들에 대해 미안해. 그러나 하나님 께 감사드립니다. 나는 이미 그 해답을 발견했습니다.

2

Sample 진행 중이거나 기다리는 과정.

2

간단한 접근 방법으로 피터를 찾아 낼 수도 있습니다. "응답하지 않음"은 이벤트 대기열의 이벤트를 5 초 이상 처리하지 않았 음을 의미합니다 (2 초 였지만 10.4로 상향 조정). UI 프로세스의 경우 회전 대기 커서가 생성되지만 UI가 아닌 프로세스의 경우에는 효과를 쉽게 볼 수 없습니다.

이것은 실행 루프 기반 프로그램 인 경우 실행 루프 및 콜백 (async)으로 수행해야하는 차단 (동기) 작업으로 무언가를하고 있다는 것을 의미합니다. 또는 메인 스레드가 이벤트에 계속 응답 할 수 있도록 차단 작업을 처리하는 데 두 번째 스레드가 필요합니다.

+0

거기에 몇 가지 정보가 있습니다. 나는 나중에 내 코드를 점검 할 것이다. 고마워요 :) – jopes