3

设想:

我在 mac 应用程序和 launchd 守护程序(用 Foundation 类编写)之间有一个基于分布式对象的 IPC。由于我之前遇到过关于异步消息传递的问题(例如,我有一个 registerClient: 在服务器的根对象上,并且每当发生事件时服务器的根对象通知/调用客户端代理对象中的方法),我进行了长轮询,这意味着客户端“收获”来自守护进程的事件/通知列表。这种“收获”是通过服务器对象方法调用完成的,然后返回一个 NSArray 实例。

它工作得很好,直到几秒钟后,服务器对象的进程(通过 launchd 启动)开始被标记为红色,旁边有“(未响应)”标签(在活动监视器内)。就像我说的,在功能上,它运作良好,但我们只是想摆脱这个“不响应”的标签。

如何防止出现此“未响应”标签?

仅供参考,我之前已经做过基于启动的流程,这是我第一次进行长轮询。此外,我尝试了基于 NSSocketPortNameServer 的连接以及基于 NSSocketPort 的连接。他们没有这个问题。锁定也不是问题,因为使用的锁只是 NSCondition 的,我们记录并调试了程序,似乎唯一的锁定“问题”在收获部分,实际上,在功能上有效。此外,客户端进程是用 PyObjC 编写的,而服务器进程是使用 ObjC 编写的。

提前致谢。

4

3 回答 3

2

对过程进行采样以了解它正在做什么或等待什么。

于 2009-06-25T21:33:30.383 回答
2

彼得的方法是正确的,尽管您可以通过简单的检查来弄清楚。“未响应”意味着您至少 5 秒没有处理事件队列上的事件(过去是 2 秒,但他们在 10.4 中提高了它)。对于 UI 进程,这将创建一个旋转的等待光标,但对于非 UI 进程,您不会轻易看到效果。

如果这是一个基于 runloop 的程序,则意味着您可能正在使用阻塞(同步)操作进行某些操作,而该操作应该使用 run loop 和回调(异步)来完成。或者,您需要第二个线程来处理您的阻塞操作,以便您的主线程可以继续响应事件。

于 2009-06-26T14:30:11.297 回答
2

我的问题实际上是调用使用签名获取进程的 PID FNDR......该部分导致“无响应”错误,它从来不是锁或长轮询部分。对不起这些家伙。但是感谢上帝,我已经找到了答案。

于 2009-08-25T23:45:07.200 回答