您的位置:首页 > 其它

支持多线程的DRB server

2012-01-06 09:24 127 查看
DRB是ruby的远程进程调用(remote process calling)机制,类似于java的RMI。在一个项目中采用了DRB实现server与client之间的通信,其中对于server有以下要求:
a) 并发处理多个client的请求,对于每个client用一个线程来处理;
b) client发出请求后可以立即返回,不需要阻塞在那里等待server处理。

代码比较短,不过因为我不熟悉ruby线程和drb,写的过程中踩到几个陷阱。现在把实现时需要注意的几点总结如下:
1) 给client调用的接口函数在server主线程。为了实现上述b),这个函数不完成具体处理,只是创建新的timer对象,并且把client的请求放到消息队列里面。

2) 在主线程里,当drb服务启动之后,执行server.run。这个server.run是一个死循环(消息循环)。每次从消息队列里面取出排在头上的消息,创建子线程,把对应的timer放到子线程里面对消息进行处理。处理完了这个子线程就exit。

3) ruby启动子线程有thread.join和thread.run两种方式。其中join会让主线程阻塞,等待子线程退出之后才返回。我一开始用的join,结果主线程挂起了,只有等第一个子线程处理完退出之后才会读第二条消息,创建第二个子线程,所以没有并发起来。改成run,主线程不会阻塞,就可以并发了。但是run是当主线程退出时,所有子线程都会被强制结束。所以把主线程的server.run做成死循环,保证每个子线程都可以正常执行完再退出。

此外还有两个需要优化的地方,作为下一步的工作:
1) 现在这样频繁的创新子线程比较耗资源,做成线程池的方式会好一些。
2) 现在只有一个消息队列,按FIFO处理的。还可以做得更灵活一些,比如支持多个优先级。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: