支持多线程的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处理的。还可以做得更灵活一些,比如支持多个优先级。
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处理的。还可以做得更灵活一些,比如支持多个优先级。
相关文章推荐
- 支持多线程的CLOG类
- VC中多线程(一)Win32 API对多线程编程的支持
- C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)
- 扩展小程序基类支持多线程
- 友善之臂的qtopia2.2.0加入多线程支持
- ServiceStack.Redis对多线程的支持
- Junit 测试不支持多线程踩记及解决方案
- 让libevent支持多线程 (使用socketpair通知方式)
- Revit二次开发是否支持多线程?
- Python爬虫之路——简单网页抓图升级版(增加多线程支持)
- c++11的多线程支持一(线程启动)
- 一个简单的支持多聊天室的多线程聊天程序
- python多线程编程(1): python对多线程的支持
- 使文件下载的自定义连接支持 FlashGet 的断点续传多线程链接下载! JSP/Servlet 实现!
- 详解Springboot对多线程的支持
- Python的多线程支持-pybatis的准备阶段(十一)
- gcc g++ 支持 c++0x的办法 实现多线程
- 发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
- Operation queues中多线程的支持
- Live555 的一个缺陷--例子不能支持多线程(已经修改成支持多线程)