Распределенные объекты, Threading, Objective-C - PullRequest
4 голосов
/ 23 января 2012

У меня есть работающее приложение сервер / клиент, использующее распределенные объекты в target-c. Сейчас я борюсь с тем, чтобы сделать приложение многопоточным. Так что больше пользователей могут одновременно получить доступ к серверу.

Вот основная функция для сервера. Здесь я создаю объект nsconnection.

Насколько я понимаю, я должен подходить к этому, когда пользователь пытается получить доступ к серверу, для этого конкретного вызова должен быть выделен новый поток. Должен ли [conn runInNewThread] позаботиться об этом?

Любые мысли приветствуются ...

Вот код для сервера.

int main (void)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Transactions *trans = [Transactions new];
NSConnection *conn  = [NSConnection defaultConnection];        
[conn setRootObject: trans];
[conn runInNewThread];

if (![conn registerName:@"holycow"]) 
{
    NSLog (@"Failed registering holycow.");
    exit (1);
}

NSLog (@"waiting for connections...");
[[NSRunLoop currentRunLoop] run];

[pool release];
return 0;
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2016

@ Параг Бафна был прав в своем ответе, когда я проводил тест. Тем не менее, я использовал особый вид архитектуры на сервере, который мог бы помочь в этом. Возьмем, к примеру, команду, которая долго запускается на демоне сервера. Это может немного повредить сервер и значительно замедлить обработку соединений. Вот мое решение.

  1. Пусть клиент вызовет асинхронный метод класса, используя свойство oneway. Давайте назовем это runProcess.

  2. Заставьте runProcess выполнить popen() задачу и сохранить PID в качестве глобальной переменной.

  3. Затем заставьте его использовать performSelectorInBackground для запуска синхронного метода класса с именем readProcess в фоновом режиме.

  4. В readProcess я использую while(fgets(buff, sizeof(buff), ghPID)!=NULL), чтобы прочитать ранее установленный вывод popen() (обратите внимание на глобальную переменную ghPID) и добавить последнюю прочитанную строку в глобальную переменную последних прочитанных строк. Этот метод выполняется как фоновая задача, и клиент уже отключился от runProcess.

  5. Теперь клиент должен подключиться к синхронному методу класса с именем getProcessData. Затем следует прочитать глобальную переменную последних строк и вернуть ее обратно. Поскольку это не занимает много времени, клиент довольно быстро отключается от этого метода класса.

  6. Затем клиент может опрашивать эти данные, пока не узнает, что это сделано. Чтобы помочь в этом, вы можете создать синхронный метод с именем isProcessRunning, который может проверять глобальную логическую переменную на демоне сервера с именем gbRunning и возвращать true / false. Однако, конечно, вам нужно будет перевернуть эту переменную в демоне сервера true / false в различных методах класса, когда сервер занят выполнением задачи popen().

Делая это таким образом, серверный демон может гораздо быстрее отвечать на параллельные запросы.

Дополнительным советом будет использование файла уничтожения или другого механизма (совместно используемая память? SIGHUP?), Чтобы, если вы находитесь в цикле while и хотите остановить этот процесс, вы можете просто удалить файл уничтожения где-нибудь в Например, / tmp, и процесс будет использовать pclose, чтобы уничтожить его, а затем стереть файл уничтожения. Я также делаю это перед запуском процесса, если хочу убедиться, что одновременно с этим демоном сервера запускается только один конкретный процесс.

0 голосов
/ 26 февраля 2012

Чтобы отвечать на клиентские сообщения, отвечающий объект сервера должен быть установлен как «корневой объект» экземпляра класса NSConnection, и это NSConnection должно быть зарегистрировано в сети по имени.

Таким образом, в случае Распределенный объект , один объект сервера может обрабатывать несколько клиентов.или вы можете создать больше серверных объектов и разделить ваших клиентов.

...