@ Параг Бафна был прав в своем ответе, когда я проводил тест. Тем не менее, я использовал особый вид архитектуры на сервере, который мог бы помочь в этом. Возьмем, к примеру, команду, которая долго запускается на демоне сервера. Это может немного повредить сервер и значительно замедлить обработку соединений. Вот мое решение.
Пусть клиент вызовет асинхронный метод класса, используя свойство oneway
. Давайте назовем это runProcess
.
Заставьте runProcess
выполнить popen()
задачу и сохранить PID в качестве глобальной переменной.
Затем заставьте его использовать performSelectorInBackground
для запуска синхронного метода класса с именем readProcess
в фоновом режиме.
В readProcess
я использую while(fgets(buff, sizeof(buff), ghPID)!=NULL)
, чтобы прочитать ранее установленный вывод popen()
(обратите внимание на глобальную переменную ghPID
) и добавить последнюю прочитанную строку в глобальную переменную последних прочитанных строк. Этот метод выполняется как фоновая задача, и клиент уже отключился от runProcess
.
Теперь клиент должен подключиться к синхронному методу класса с именем getProcessData
. Затем следует прочитать глобальную переменную последних строк и вернуть ее обратно. Поскольку это не занимает много времени, клиент довольно быстро отключается от этого метода класса.
Затем клиент может опрашивать эти данные, пока не узнает, что это сделано. Чтобы помочь в этом, вы можете создать синхронный метод с именем isProcessRunning
, который может проверять глобальную логическую переменную на демоне сервера с именем gbRunning
и возвращать true / false. Однако, конечно, вам нужно будет перевернуть эту переменную в демоне сервера true / false в различных методах класса, когда сервер занят выполнением задачи popen()
.
Делая это таким образом, серверный демон может гораздо быстрее отвечать на параллельные запросы.
Дополнительным советом будет использование файла уничтожения или другого механизма (совместно используемая память? SIGHUP?), Чтобы, если вы находитесь в цикле while и хотите остановить этот процесс, вы можете просто удалить файл уничтожения где-нибудь в Например, / tmp, и процесс будет использовать pclose
, чтобы уничтожить его, а затем стереть файл уничтожения. Я также делаю это перед запуском процесса, если хочу убедиться, что одновременно с этим демоном сервера запускается только один конкретный процесс.