ps:Python多线程由于全局锁的存在并无卵用

多进程编程才能利用多核优势

首先来看单线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#coding=utf-8
from time import ctime,sleep
def music(func):
for i in range(2):
print "I was listening to %s. %s" %(func,ctime())
sleep(4)
def movies(func):
for i in range(2):
print "I was watching the %s. %s" %(func,ctime())
sleep(5)
if __name__ == '__main__':
music(u'音乐')
movies(u'电影')
print "all over in %s" %ctime()

运行结果如图

1

播放第一首音乐花费了07~11 播放第二首音乐花费了11~15 播放第一场电影花费了15~20 播放第二场电影花费了20~25

听音乐和看电影是顺序进行的,一共花费了07~25一共18s的时间

接下来看多线程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#coding=utf-8
import threading
from time import ctime,sleep
def music(func):
for i in range(2):
print "I was listening to %s. %s" %(func,ctime())
sleep(4)
def movies(func):
for i in range(2):
print "I was watching the %s. %s" %(func,ctime())
sleep(5)
threads = []
t1 = threading.Thread(target=music,args=(u'音乐',)) #创建线程
threads.append(t1) #加入threads列表
t2 = threading.Thread(target=movies,args=(u'电影',))
threads.append(t2)
if __name__ == '__main__':
for t in threads:
t.start() #遍历列表并且开始列表中的线程
for t in threads:
t.join() #等待列表中所有子线程结束
print "all over %s" %ctime() #父进程

首先导入threading模块

创建threads列表,使用threading.Thread()方法分别创建t1和t2线程,通过target分别调用music和movies方法,通过args传递参数

并且把创建的线程append()到threads列表中

使用start()方法开始线程的运行,使用join()方法等待线程运行结束再执行父进程

运行结果如图

2

可以看到音乐线程和电影线程均是在59的时刻同时进行,所有线程在09的时刻结束,总共花费10s,相比之前的单线程节省了8s的时间

不难发现两条线程同时运行,所花费的总时间是由运行时间最长的那条线程决定的,因此即使音乐的时间也延长到5s

1
2
3
4
def music(func):
for i in range(2):
print "I was listening to %s. %s" %(func,ctime())
sleep(5)

对运行的总时间也不会产生影响