3

シナリオ:

Mac アプリケーションと launchd デーモン (Foundation クラスで作成) の間に分散オブジェクトベースの IPC があります。非同期メッセージングに関して以前に問題があったため (たとえば、サーバーのルート オブジェクトに registerClient: があり、サーバーのルート オブジェクトがクライアントのプロキシ オブジェクトのメソッドを通知/呼び出しするイベントがあるときはいつでも)、ロング ポーリングを行いました。クライアントは、デーモンからのイベント/通知のリストを「収集」します。この「収集」は、サーバー オブジェクト メソッド呼び出しによって行われ、NSArray インスタンスが返されます。

数秒間、サーバー オブジェクトのプロセス (launchd を介して起動された) の横に "(応答なし)" タグが付けられた赤いラベルが付けられます (アクティビティ モニター内)。私が言ったように、機能的にはうまく機能しますが、この「応答なし」ラベルを取り除きたいだけです。

この「応答なし」タグを防ぐにはどうすればよいですか?

参考までに、以前にlaunchdベースのプロセスを実行しましたが、ロングポーリングを実行したのはこれが初めてです。また、NSSocketPortNameServer ベースの接続と NSSocketPort ベースの接続も試しました。彼らにはこの問題はありませんでした。ロックも問題ではありませんでした。使用されているロックは NSCondition だけのものであり、プログラムをログに記録してデバッグしたところ、ロックの「問題」はハーベスティング部分だけであり、実際には機能的に機能しているようです。また、クライアント プロセスは PyObjC で記述され、サーバー プロセスは ObjC で記述されます。

前もって感謝します。

4

3 に答える 3

2

ピーターのアプローチは正しいですが、簡単な検査でそれを理解できるかもしれません。「応答していません」とは、イベント キューで少なくとも 5 秒間イベントを処理していないことを意味します (以前は 2 秒でしたが、10.4 では増加しました)。UI プロセスの場合、これにより回転する待機カーソルが作成されますが、非 UI プロセスの場合、効果は簡単にはわかりません。

これが実行ループベースのプログラムである場合は、実行ループとコールバック (非同期) で実行する必要があるブロッキング (同期) 操作で何かを実行している可能性があります。または、メインスレッドが引き続きイベントに応答できるように、ブロック操作を処理するための 2 つ目のスレッドが必要です。

于 2009-06-26T14:30:11.297 に答える
2

私の問題は、実際には署名を使用してプロセスの PID を取得するための呼び出しでしたFNDR...その部分が「応答なし」エラーを引き起こし、ロックやロングポーリング部分ではありませんでした。この人たちでごめんなさい。しかし、私はすでに答えを見つけたことを神に感謝します.

于 2009-08-25T23:45:07.200 に答える
2

プロセスをサンプリングして、プロセスが何をしているか、何を待っているかを調べます。

于 2009-06-25T21:33:30.383 に答える