多线程并发效率问题
各位大侠,小弟最近在搞多线程的时候遇到点难题,想请各位大侠指教:问题:系统属性:16核cpu,64G内存的服务器,处理多线程并发处理数据,消息队列长度为1000,存放ta...
各位大侠,小弟最近在搞多线程的时候遇到点难题,想请各位大侠指教:
问题:系统属性:16核cpu,64G内存的服务器,处理多线程并发处理数据,消息队列长度为1000,存放task任务,线程个数--目前起了20条线程,轮训队列,有task则唤醒线程poptask进行处理,各种互斥与同步问题解决,无死锁现象,在每个条线程里会调用一个处理时间大约为3s的函数,若单线程跑,执行时间为3s左右正常,并发20条线程,由于cpu时间片轮转,导致所有线程处理时间暴增,大约会增加到10s左右,考虑了多进程配合,但是发现并发量增加时,多线程处理时间趋于多进程时间,且多进程耗费资源过大且不好管理,请问各位大侠,如何能够提高效率啊,现在可以牺牲空间求得时间,求教 展开
问题:系统属性:16核cpu,64G内存的服务器,处理多线程并发处理数据,消息队列长度为1000,存放task任务,线程个数--目前起了20条线程,轮训队列,有task则唤醒线程poptask进行处理,各种互斥与同步问题解决,无死锁现象,在每个条线程里会调用一个处理时间大约为3s的函数,若单线程跑,执行时间为3s左右正常,并发20条线程,由于cpu时间片轮转,导致所有线程处理时间暴增,大约会增加到10s左右,考虑了多进程配合,但是发现并发量增加时,多线程处理时间趋于多进程时间,且多进程耗费资源过大且不好管理,请问各位大侠,如何能够提高效率啊,现在可以牺牲空间求得时间,求教 展开
1个回答
展开全部
优化调度可以再调高效率。
队列不要频繁的添加,删除节点。
使用一个全局变量标记队列中前多少个节点已经处理。
使用队列节点求摸(mod)来调度线程处理。
比如20个线程,0线程负责队列的,0,20,40,60...的节点任务
1线程 1,21,41,61...的节点任务
2线程 2,22,42,62...的节点任务
然后,你懂了。
队列不要频繁的添加,删除节点。
使用一个全局变量标记队列中前多少个节点已经处理。
使用队列节点求摸(mod)来调度线程处理。
比如20个线程,0线程负责队列的,0,20,40,60...的节点任务
1线程 1,21,41,61...的节点任务
2线程 2,22,42,62...的节点任务
然后,你懂了。
更多追问追答
追问
现在有关队列的管理已经优化过了,时间不是卡在对消息的响应上,主要是消耗在线程内部对收到的数据进行处理上,计算量和系统消耗都很大,cpu轮转的时候本来单线程直接ok,多线程轮转会在处理数据的时候,一条数据处理要3s左右,这个也已经优化很多次了,结果一轮转,变10s了,不知道该怎么解决了~
追答
每个线程处理一条数据的时间这 --实际处理时间,这个固定下后
------------
减少你线程个数,使得线程个数< cpu 核数。
你提到你cpu16核的。起20线程,会降低的。你最多起16个线程吧,这样会好点的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询