datasnap 的线程池(转)
datasnap的线程池
新的datasnap使用INDY10的线程池。不管你知不知道,DATASNAP都是使用线程池了,这和MIDAS不同,MIDAS默认是没有线程池的。
跟踪INDY10线程池类TIdSchedulerOfThreadPool的代码:
procedure TIdSchedulerOfThreadPool.Init;
begin
inherited Init;
Assert(FThreadPool<>nil);
if not IsDesignTime then begin
if PoolSize > 0 then begin
with FThreadPool.LockList do try
while Count < PoolSize do begin
Add(NewThread);
end;
finally FThreadPool.UnlockList; end;
end;
end;
end;
由此可知TDSTCPServerTransport.poolsize属性,默认值是10,表示线程池初始化的时候在池内创建10个线程,这个默
认值太小,应该设大点。TDSTCPServerTransport.maxThreads属性,默认值是0,表示线程池内创建线程的个数不设上限。池应
该设一个可创建线程数量的上限值,不能允许无限制地创建线程。
线程池的POOLSIZE属性的值应该设大些,这样线程池初始化的时候就在池内创建了许多的线程,以后需要使用线程的时候,就直接从池内取,不需要
再去创建新的线程,这节约了大量的CPU时间,但大量的线程需要占用较多的内存空间。服务器端的内存空间一般都比较大,用空间换时间的策略是值得的。服务
器端其它的对象池也应该用此策略。对象池创建的时候设置POOLSIZE=0的方法是不可取的,应该尽量设大一点,占用点内存空间其实根本不算什么。
TDSServerClass.LIFECycle属性的值对线程池的利用效率至关重要。当LIFECYCLE=SESSION,一个客户端连接从
线程池中获取一个线程为其服务,当这个客户端断开连接的时候把这个占用的线程归还线程池中,这个线程占用的时间是有些长啊;当
LIFECYCLE=SERVER,所有的客户连接都共用一个从线程池中获取的线程为它们服务,这个时候线程池好像真是多此一举不是,官方资料说是如果你
的服务器硬件穷的慌就用它,估计没几个人会穷到如此份上吧;当LIFECYCLE=INVOCATION,一个客户端发起一个事件动作就从线程池中获取一
个线程为它服务,这个有点费事,什么鸡毛点儿的事就要获取一个线程为它服务,一眨眼的时间这事它完了,线程立马归还线程池中,如此频繁,咱真有点儿担心线
程池吃的消不。所以本人满打满算还是从了官方的建议:使用默认的SESSION值。
datasnap 的线程池(转)的更多相关文章
- 论DATASNAP中间件对象池
在此,笔者以DATASNAP为例,其它中间件以此类推. 中间件为什么要使用对象池? 对象池——让所有的对象免堕轮回之苦,对象不再为其生和死而烦恼. 要想让中间件长久稳定地运行,做到无人值守,对象池很重 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
- C#多线程之线程池篇1
在C#多线程之线程池篇中,我们将学习多线程访问共享资源的一些通用的技术,我们将学习到以下知识点: 在线程池中调用委托 在线程池中执行异步操作 线程池和并行度 实现取消选项 使用等待句柄和超时 使用计时 ...
- NGINX引入线程池 性能提升9倍
1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...
- Java线程池解析
Java的一大优势是能完成多线程任务,对线程的封装和调度非常好,那么它又是如何实现的呢? jdk的包下和线程相关类的类图. 从上面可以看出Java的线程池主的实现类主要有两个类ThreadPoolEx ...
- Android线程管理之ExecutorService线程池
前言: 上篇学习了线程Thread的使用,今天来学习一下线程池ExecutorService. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Execu ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
随机推荐
- VMWare虚拟机下为Ubuntu 12.04.1配置静态IP_转
转自:http://www.cnblogs.com/objectorl/archive/2012/09/27/vmware-ubuntu-nat-static-ip-settings.html 背景在 ...
- 第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- python之map、filter、reduce、lambda函数
map map函数根据提供的函数对指定的序列做映射,定义:map(function, sequence[,sequence,...])--->list 例1 >>> map(l ...
- perl 学习杂项笔记
### 由于perl 语法属于很自由的那种, 建议出现错误的时候打开 -w 或者使用 -Mdiagnositics 试一下 ### 如何调试 perl程序 http://www.ibm.com/dev ...
- Java基础之一组有用的类——使用公历日历(TryCalendar)
控制台程序. 公历是西方使用的日历,用GregorianCalendar类的对象来表示.GregorianCalendar对象封装了时区信息.日期和时间数据.GregorianCalendar对象有7 ...
- 数据库执行监控,除了Profiler的方案
怎么查找库中的数据库相关信息: Select * from sys.databases; 返回字段: name(数据库名称) database_id(数据库id) .... Select sqlTex ...
- 《30天自制操作系统》09_day_学习笔记
harib06a: 在昨天的最后一部分,我们已经变成了32位的模式,目的就是希望能够使用电脑的全部内存. 虽然鼠标的显示处理有一些叠加问题,不过笔者为了不让我们感到腻烦,先带我们折腾一下内存 这里笔者 ...
- 《30天自制操作系统》04_day_学习笔记
harib01a: P65 用C语言实现内存写入 实现一个往黑画面上写入东西的函数 修改了naskfunc.nas中的内容 在bootpack.c中 用write_mem8()函数将VRMA中全部写入 ...
- Swift游戏实战-跑酷熊猫 14 熊猫打滚
这节内容我们来实现熊猫打滚.思路是这样的,当熊猫起跳时记录他的Y坐标,落到平台上的时候再记录它的Y坐标.两个坐标之间的差要是大于一定数值就判断它从高处落下要进行打滚缓冲.至此跑酷熊猫已经像一个游戏的样 ...
- 事件监听addEventListener()和removeEventListener() ---------1
一直想写一个原生事件监听的记录,方便以后看,不愿意写主要是事件监听的单词太长,记起来好难记每次都要查,这次把知道的写完了,来这里查好了,以后要是理解的更透彻了,就再补全好了 首先,DOM0级事件和DO ...