免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: alexhappy
打印 上一主题 下一主题

你经常使用多线程吗? [复制链接]

auld 该用户已被删除
41 [报告]
发表于 2008-11-23 22:10 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
42 [报告]
发表于 2008-11-23 22:55 |只看该作者
原帖由 auld 于 2008-11-23 22:10 发表
从来在网站只看帖没有发过贴, 今天见大家讨论的有些乱, 所以写了些东西希望能对大家有所帮助
提几个我的看法给大家参考一下: 考虑一下实际使用中的编程模式, 有如下几种.
     (关于线种和进程的问题, 我这细 ...


1,多路并发不要求追求极端性能的话,select最好
2,追求极端性能,linux下epoll,其他unix下的AIO,windows下IOCP最好
3,如果2不能满足公平,加入多线程,保证所有请求的公平对待
注意2永远比3的性能好,引入多线程不是为了性能,是为了公平,防止一些请求处理时间过长影响其他请求的响应

论坛徽章:
0
43 [报告]
发表于 2008-11-24 08:57 |只看该作者
原帖由 wishel 于 2008-11-23 22:55 发表


1,多路并发不要求追求极端性能的话,select最好
2,追求极端性能,linux下epoll,其他unix下的AIO,windows下IOCP最好
3,如果2不能满足公平,加入多线程,保证所有请求的公平对待
注意2永远比3的性能好 ...

为什么说多线程阻塞永远比单线程非阻塞(性能)好呢?莫不是它能更加充分地利用系统资源???

To: auld
我现在用的便是多线程非阻塞模式,我想。。。。嗯,这种模式集多线程阻塞和单线程非阻塞的优点为一体,其总体性能应该更好吧?
PS:而且,一般情况下,只要条件允许,我都是用多线程非阻塞模式。。。。

论坛徽章:
0
44 [报告]
发表于 2008-11-24 10:36 |只看该作者
现在的PC也是单CPU多核的了,如果设计的好的话多线程应该比单线程有优越性的

论坛徽章:
0
45 [报告]
发表于 2008-11-24 12:16 |只看该作者
原帖由 alexhappy 于 2008-11-24 08:57 发表

为什么说多线程阻塞永远比单线程非阻塞(性能)好呢?莫不是它能更加充分地利用系统资源???

To: auld
我现在用的便是多线程非阻塞模式,我想。。。。嗯,这种模式集多线程阻塞和单线程非阻塞的优点为一 ...


你弄反了,我的意思是单线程非阻塞(异步)一定比多线程性能好,不管多线程阻塞与否
原因是多线程多引入了切换和同步,这是要耗资源的,尤其是线程比较多的时候,开销很大

论坛徽章:
0
46 [报告]
发表于 2008-11-24 12:39 |只看该作者
具体例子, 比如你编写一个FTP服务器, 用什么?

论坛徽章:
0
47 [报告]
发表于 2008-11-24 12:47 |只看该作者
原帖由 wishel 于 2008-11-24 12:16 发表


你弄反了,我的意思是单线程非阻塞(异步)一定比多线程性能好,不管多线程阻塞与否
原因是多线程多引入了切换和同步,这是要耗资源的,尤其是线程比较多的时候,开销很大

这个不尽然吧?假如我们只考虑单CPU情况,那么,单线程非阻塞不一定比多线程非阻塞好,我觉得大多数时候,只要线程数适当,多线程非阻塞的性能会比单线程非阻塞的性能要好
我现在有两种想法,互相对立。。。。

1,单线程非阻塞只是跟单线程阻塞的说法不同而已,其实它就是阻塞的。。。。因为,如果我们的非阻塞操作需要结果的话,它终究会在程序执行的莫个点等待刚刚非阻塞操作的结果(阻塞操作必须得等到操作完毕之后才返回,而非阻塞可以立即返回,但是,它也必须要操作的结果啊),那么其实非阻塞操作跟阻塞操作只不过是阻塞的地方不同而已。。。。

2,或许,非阻塞操作的工作原理可能是这样,执行之后立即返回进行别的处理,处理完之后前面的非阻塞操作的结果可能已经返回(但也可能还没有返回,那么此时它还是要阻塞在这里),如此看来它的性能似乎是比多线程非阻塞要好,但是,如果频繁出现结果未能及时返回的情况,岂不是要频繁阻塞?这时如果用多线程非阻塞的话(合适的线程数),性能岂不是比单线程非阻塞的要好?

论坛徽章:
0
48 [报告]
发表于 2008-11-24 12:47 |只看该作者
原帖由 alexhappy 于 2008-11-21 16:22 发表

话虽如此,可是这些都是在我做过之后才知道的,如果在做之前我就知道的话,那我肯定会有别的方案。。。。
现在的问题是,我无法在做之前预测程序的性能,汗。。。。。
比如,处理数据库吧,很多用户请求先传 ...


1. 属于数据库能干的活就不要让逻辑服务器去干.
2. 对于多用户同时修改同一个数据记录,逻辑或应用服务器的多thread是帮不上忙的. 这是有数据哭的机制决定的.
3. 若你的逻辑服务器里有对用户请求分析处理的功能,那么多thread是用的,至少在多CPU或多核时是有用的,因为可以同时处理多个用户的请求分析.
4. 不要把多thread扩大到每个角落,比如对数据库同一个记录的修改等. 分好工很重要: 用其长而避其段.

论坛徽章:
0
49 [报告]
发表于 2008-11-24 12:56 |只看该作者
原帖由 system888net 于 2008-11-24 12:47 发表


1. 属于数据库能干的活就不要让逻辑服务器去干.
2. 对于多用户同时修改同一个数据记录,逻辑或应用服务器的多thread是帮不上忙的. 这是有数据哭的机制决定的.
3. 若你的逻辑服务器里有对用户请求分析处理的 ...

那么你的话我可以理解成这样吗?只要是对数据库进行操作,就应当使用单线程,因为多线程此时若对共享记录操作的话,可能还得花些时间同步。。。。

论坛徽章:
0
50 [报告]
发表于 2008-11-24 13:19 |只看该作者
原帖由 alexhappy 于 2008-11-24 12:56 发表

那么你的话我可以理解成这样吗?只要是对数据库进行操作,就应当使用单线程,因为多线程此时若对共享记录操作的话,可能还得花些时间同步。。。。


大体是对的,补充一下:
  对数据库的读和写是不一样的
  1 读:   select ...
  2.写:   insert , update, delete

  对于select 用好多thread是可行的.
  对于无关联的insert用好多thread是可行的.
  对于update就要看具体情况了(比如批量与否,也要看一次的量的大小,是否关联或共享等).
  对于delete 也要看具体情况了(比如批量与否,也要看一次的量的大小,是否关联或共享等,对于有的数据库,一次删除大量的记录会导致此时数据库性能急剧下降,多thread就无用了).
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP