一个电脑最多能开启多少个线程?

.Net技术 码拜 6年前 (2014-12-06) 2344次浏览 0个评论

比如:服务器上运行一C#的winForm程序.

Socket方面的 如果有连接就创建一个线程

var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

socket.Bind(new IPEndPoint(IPAddress.Any, int.Parse(txt_port.Text)));
socket.Listen(10000);//不知道是干啥的 就写10000了
socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);
所以在每次有连接的时候 都走了ClientAccepted然后会默认开个线程..

如果2003系统4G内存 最高可以有多少个连接?跟CPU有关系吗?

是不是电脑的线程没了 就死机了?

一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。
当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。
有连接就开一个线程的设计和上次一个人说要做一个表格控件,每个单元格都是一个自定义控件,搞得句柄不够用的有的一拼。
ClientAccepted里也用socket异步接收,没必要每个连接开一个线程,浪费资源。
另外32位的系统,我测试过每个进程可以开1800-1900多个线程封顶。超过后,其他线程都会处于等待状态,不会运行,直到有运行的线程退出。
我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接,如果你每个连接开一个线程,那么你能保持的TCP连接数受到线程数影响,只能不到2000个
服务器 不要用同步。
客户端同步异步都可以
线程是个好多好东西,但不能滥用。
32位系统一个进程用户空间为2G,一个线程默认需要1M堆栈(最少128K),可以算一算极限。
服务器要么异步(系统队列),要么自己处理队列。
Accept可能没必要异步,用一个线程同步处理更好。
另外活动线程太多的话,频繁的上下文切换很耗CPU。
可以开N多个,N和你的内存大小相关,但是后面的都会挂起。
—- 10分

socket.Listen(10000);//不知道是干啥的 就写10000了
看方法说明啊
BeginAccept并不是你想的那样执行一次开一个线程,实际情况是bind一个线程池线程,异步执行完后
会放回线程池,池内会保持几个(默认与CPU数量有关)空闲线程活动(减小频繁创建-销毁线程的开销)
池最大可运行的线程数量,可以通过System.Threading.ThreadPool.GetMaxThreads获取,相应地还有个Set方法,
一般情况不需要考虑最大数量(真到那时候加服务器吧),有些情况通过设置最少活动线程SetMinThreads来提高性能

—-

队列!!!!!!!

—-

开多少线程 和你CPU 有关系···
—-

引用 4 楼 xiaozhu39505 的回复:

我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接

现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?

—-

引用 16 楼 diaodiaop 的回复:
Quote: 引用 4 楼 xiaozhu39505 的回复:

我之前做过一个采集的项目,下位机设备会主动TCP连接服务器,用socket异步可以保持1W多个TCP连接

现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?

百万级别的这个就得做均衡负载了,这个可不是靠程序优化就能解决的

—-

引用 16 楼 diaodiaop 的回复:

现在我的需求就跟你这个差不多.. 1W多个 如果在多了呢? 比如100W个下位机. 怎么办?

没有活动的异步连接,基本上只是消耗内存而已。

—-

没有限制,但开多了很慢

—-

微软操作系统的线程一共才几百个。

你想想你的程序开多了会在怎样

—-

xiaozhu39505 小辉?

呵呵,在这里见到你了,好久没联系了,当时我们用 socket异步修改程序后续的情况我不是很清楚了,实际运行后对服务器的占用率有多大?

现在我又一次面对当时的情况了,是一个手机端即时通讯程序,需要连几万个客户端

—-

引用 22 楼 gxch 的回复:

xiaozhu39505 小辉?

呵呵,在这里见到你了,好久没联系了,当时我们用 socket异步修改程序后续的情况我不是很清楚了,实际运行后对服务器的占用率有多大?

现在我又一次面对当时的情况了,是一个手机端即时通讯程序,需要连几万个客户端

哈哈,谷哥吗?当时只是测试的可连接数,没有具体测试服务器负载情况。socket异步里就使用了完成端口,用异步是效率最高的,至于负载情况,还得具体测试才行哈

—-

貌似有线程池

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明一个电脑最多能开启多少个线程?
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!