分布式对象、线程、Objective-C
Posted
技术标签:
【中文标题】分布式对象、线程、Objective-C【英文标题】:Distributed Objects, Threading, 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;
【问题讨论】:
【参考方案1】:为了响应客户端消息,响应的服务器对象 必须设置为 NSConnection 实例的“根对象” 类,并且这个 NSConnection 必须通过 姓名。
所以在Distributed object 的情况下,单个服务器对象可以处理多个客户端。或者您可以创建更多服务器对象并划分您的客户端。
【讨论】:
这对我来说似乎是这样。我能够让两个客户端应用程序同时通过 DO 调用同步(意思是,我没有使用oneway
关键字)类方法。就像它自动为它穿线一样。它有点慢,因为服务器正忙于做一些困难的事情,但是当我给它一秒钟时,服务器在同时处理另一个任务时做出了响应。但是,我建议编码人员使用单向(异步)方法启动任务,然后使用运行速度快的同步方法检查它。【参考方案2】:
@Parag Bafna 在我进行测试时的回答是正确的。但是,我在服务器中使用了一种特殊的体系结构,它可能对此有所帮助。以在服务器守护程序上运行需要很长时间的命令为例。这可能会使服务器挂起一点,并使处理连接的速度变慢。这是我的解决方案。
让客户端使用oneway
属性调用异步类方法。我们称之为runProcess
。
让runProcess
对任务执行popen()
并将PID 保留为全局变量。
然后,让它使用performSelectorInBackground
在后台运行一个名为readProcess
的同步类方法。
runProcess
断开连接。
现在让客户端连接到名为getProcessData
的同步类方法。然后,这应该读取最近行的全局变量并将其返回。由于这不会花费很长时间,因此客户端会很快与该类方法断开连接。
然后客户端可以轮询该数据,直到它知道它已完成。为此,您可以创建一个名为isProcessRunning
的同步方法,该方法可以检查服务器守护程序上名为gbRunning
的全局布尔变量并返回真/假。当然,当服务器忙于运行 popen()
任务时,您可以在各种类方法中翻转服务器守护程序中的该变量 true/false。
通过这种方式,您的服务器守护进程可以更快地响应并发请求。
另一个技巧是使用终止文件或其他机制(共享内存?SIGHUP?),这样如果您处于一个while循环中并且您希望该进程停止,您可以将一个终止文件放在某处/tmp 例如,该进程将使用pclose
将其杀死,然后擦除该杀死文件。如果我想确保从该服务器守护进程一次只运行一个特定进程,我也会在启动进程之前执行此操作。
【讨论】:
以上是关于分布式对象、线程、Objective-C的主要内容,如果未能解决你的问题,请参考以下文章