Распределенные объекты Cocoa, Длительный опрос, запуск и “Не отвечает” в Activity Monitor

StackOverflow https://stackoverflow.com/questions/1044039

Вопрос

Сценарий:

У меня есть IPC на основе распределенных объектов между приложением Mac и демоном launchd (написанным с использованием базовых классов).Поскольку раньше у меня были проблемы, связанные с асинхронным обменом сообщениями (напримерУ меня есть registerClient:на корневом объекте сервера и всякий раз, когда происходит событие, корневой объект сервера уведомляет / вызывает метод в прокси-объекте клиента), я выполнил длительный опрос, который означал, что клиент "собирает" списки событий / уведомлений от демона.Этот "сбор урожая" выполняется с помощью вызова метода серверного объекта, который затем возвращает экземпляр NSArray.

Это работает довольно хорошо, пока в течение нескольких секунд процесс серверного объекта (запущенный через launchd) не начинает помечаться красным цветом с тегом "(Не отвечает)" рядом с ним (внутри Activity Monitor).Как я уже сказал, функционально это работает хорошо, но мы просто хотим избавиться от этого ярлыка "Не отвечает".

Как я могу предотвратить этот тег "Не отвечает"?

К вашему сведению, я уже запускал процессы на основе launchd раньше, и это первый раз, когда я проводил длительный опрос.Кроме того, я попробовал подключения на основе NSSocketPortNameServer, а также на основе NSSocketPort.У них не было этой проблемы.Блокировка также не была проблемой, потому что используемые блокировки были только NSCondition, и мы зарегистрировали и отладили программу, и кажется, что единственная "проблема" с блокировкой связана с частью сбора урожая, которая на самом деле функционально работает.Кроме того, клиентский процесс написан на PyObjC, в то время как серверный процесс был написан с использованием ObjC.

Заранее благодарю.

Это было полезно?

Решение 3

Моя проблема на самом деле заключалась в том, что требовалось получить PID процесса с использованием подписи FNDR...эта часть вызвала ошибку "Не отвечает", и это никогда не было частью блокировок или длительного опроса.Извините за это, ребята.Но, слава Богу, я уже нашел ответ.

Другие советы

Образец процесс, позволяющий выяснить, что он делает или чего ждет.

Питер прав в своем подходе, хотя вы, возможно, сможете понять это с помощью простого осмотра."Не отвечает" означает, что вы не обрабатываете события в своей очереди событий по крайней мере в течение 5 секунд (раньше было 2 секунды, но они увеличили это время в версии 10.4).Для процесса пользовательского интерфейса это создало бы вращающийся курсор ожидания, но для процесса, не связанного с пользовательским интерфейсом, вы не так легко увидите эффекты.

Если это программа на основе runloop, это означает, что вы, вероятно, делаете что-то с блокирующей (синхронной) операцией, которая должна выполняться с помощью цикла выполнения и обратного вызова (асинхронного).С другой стороны, вам нужен второй поток для обработки ваших операций блокировки, чтобы ваш mainthread мог продолжать реагировать на события.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top