多线程模型

多线程模型

线程是一个有意思的话题,在工作中也经常面临,故列个提纲,后续写一下.
有一些方面还不熟悉,希望通过书写让思路更加清晰。

从几个方面来探讨多线程问题
1、用循环的例子来引入多线程的效率提示
2、抢占式多线程带来资源竞争问题
3、资源竞争问题的解决办法之一,锁
4、线程切换也是一种开销,并不是所有的都适用多线程
5、线程的创建销毁也是一笔不小的开销,线程池的实现
6、不同语言C,C++,JAVA,PYTHON对1、2、3、4、5问题的处理

一、python篇

1、循环执行任务使得效率低下演示

import time

def timstr(ltime=None):
    return time.strftime("[%Y-%m-%d %H:%M:%S]",time.localtime(ltime))

def work_task(args,cnt=2):
    time.sleep(cnt)    
    print("%s	args=%s,cnt=%d
" % (timstr(),args,cnt))
    return 
def main1():
    start = time.time()
    for x in range(1,10):
        work_task(cnt=1,args=x)
    print("Elapsed time: %s" % (time.time()-start))

main1()
 



[2015-11-10 13:08:24]	args=1,cnt=1

[2015-11-10 13:08:25]	args=2,cnt=1

[2015-11-10 13:08:26]	args=3,cnt=1

[2015-11-10 13:08:27]	args=4,cnt=1

[2015-11-10 13:08:28]	args=5,cnt=1

[2015-11-10 13:08:29]	args=6,cnt=1

[2015-11-10 13:08:30]	args=7,cnt=1

[2015-11-10 13:08:31]	args=8,cnt=1

[2015-11-10 13:08:32]	args=9,cnt=1

Elapsed time: 9.04143500328064

2、多线程开启使得批量任务的执行时间和单次一样演示

from threading import Thread
class GetThread(Thread):
    def __init__(self, index):
        self.index = index 
        super(GetThread, self).__init__()
 
    def run(self):
        work_task(self.index,cnt=2)
        return 
def main2():        
    start = time.time()
    threads = []
    for index in range(1,10):
        t=GetThread(index);
        threads.append(t)
        t.start()
    for t in threads:
        t.join()
    print("Elapsed time: %s" % (time.time()-start))

print("start time: %s
" % (timstr()))
main2()    
print("end time: %s
" % (timstr()))

start time: [2015-11-10 13:09:30]

[2015-11-10 13:09:32]	args=1,cnt=2
[2015-11-10 13:09:32]	args=4,cnt=2

[2015-11-10 13:09:32]	args=2,cnt=2

[2015-11-10 13:09:32]	args=3,cnt=2


[2015-11-10 13:09:32]	args=5,cnt=2

[2015-11-10 13:09:32]	args=6,cnt=2

[2015-11-10 13:09:32]	args=7,cnt=2

[2015-11-10 13:09:32]	args=8,cnt=2

[2015-11-10 13:09:32]	args=9,cnt=2

Elapsed time: 2.0126969814300537
end time: [2015-11-10 13:09:32]

3、由于抢占式多线程使得资源竞争--无逾期效果-演示

4、由于抢占式多线程使得资源竞争--无逾期效果-锁修复演示

5、线程频繁创建导致开销大之系统线程池的使用

6、线程频繁创建导致开销大之自己实现线程池

7、待处理数据任务排队的一般解决方案队列

原文地址:https://www.cnblogs.com/luomgf/p/4951654.html