【问题标题】:Distributed Objects, Threading, Objective-C分布式对象、线程、Objective-C
【发布时间】:2012-01-23 03:43:16
【问题描述】:

我有一个使用 Objective-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;
}

【问题讨论】:

    标签: objective-c multithreading distributed-objects


    【解决方案1】:

    为了响应客户端消息,响应的服务器对象 必须设置为 NSConnection 实例的“根对象” 类,并且这个 NSConnection 必须通过 姓名。

    所以在Distributed object 的情况下,单个服务器对象可以处理多个客户端。或者您可以创建更多服务器对象并划分您的客户端。

    【讨论】:

    • 这对我来说似乎是这样。我能够让两个客户端应用程序同时通过 DO 调用同步(意思是,我没有使用 oneway 关键字)类方法。就像它自动为它穿线一样。它有点慢,因为服务器正忙于做一些困难的事情,但是当我给它一秒钟时,服务器在同时处理另一个任务时做出了响应。但是,我建议编码人员使用单向(异步)方法启动任务,然后使用运行速度快的同步方法检查它。
    【解决方案2】:

    @Parag Bafna 在我进行测试时的回答是正确的。但是,我在服务器中使用了一种特殊的体系结构,它可能对此有所帮助。以在服务器守护程序上运行需要很长时间的命令为例。这可能会使服务器挂起一点,并使处理连接的速度变慢。这是我的解决方案。

    1. 让客户端使用oneway 属性调用异步类方法。我们称之为runProcess

    2. runProcess 对任务执行popen() 并将PID 保留为全局变量。

    3. 然后,让它使用performSelectorInBackground在后台运行一个名为readProcess的同步类方法。

    4. 1234563该方法作为后台任务运行,客户端已经与runProcess断开连接。
    5. 现在让客户端连接到名为getProcessData 的同步类方法。然后,这应该读取最近行的全局变量并将其返回。由于这不会花费很长时间,因此客户端会很快与该类方法断开连接。

    6. 然后客户端可以轮询该数据,直到它知道它已完成。为此,您可以创建一个名为isProcessRunning 的同步方法,该方法可以检查服务器守护程序上名为gbRunning 的全局布尔变量并返回真/假。当然,当服务器忙于运行 popen() 任务时,您可以在各种类方法中翻转服务器守护程序中的该变量 true/false。

    通过这种方式,您的服务器守护进程可以更快地响应并发请求。

    另一个技巧是使用终止文件或其他机制(共享内存?SIGHUP?),这样如果您处于一个while循环中并且您希望该进程停止,您可以将一个终止文件放在某处/tmp 例如,该进程将使用pclose 将其杀死,然后擦除该杀死文件。如果我想确保从该服务器守护进程一次只运行一个特定进程,我也会在启动进程之前执行此操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2014-10-11
      相关资源
      最近更新 更多