編程的樂趣在於讓程序越來越快,這裏將給大家介紹一個種加快程序運行的的編程方式——多線程
1 著名的全局解釋鎖(GIL)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 5 16:12:14 2017
@author: 80002419
"""
import threading
import time
def cost(fun):##定義一個裝飾器,用來計算函數運行的時間
def wrapper(*args,**kargs):
before_tm = time.time()
fun(*args,**kargs);
after_tm = time.time()
fun.__doc__
print("{0} cost:{1}".format(fun.__name__,after_tm-before_tm))
return wrapper
def fibs1(n):
if (n == 1):
return 0
elif(n == 2):
return 1
else:
return fibs1(n-2)+fibs1(n-1)
def fibs2(n):
list = []
if (n == 1):
list = [0]
return list[-1]
elif(n == 2):
list = [0,1]
return list[-1]
else:
list = [0,1]
for i in range(2,n):
list.append(list[i-1]+list[i-2])
return list[-1]
@cost
def nothread():
fibs1(35)
fibs1(35)
#@cost
#def nothread1():
# print(fibs2(40))
# print(fibs2(40))
@cost
#使用多線程的程序
def inthread():
threads = []
for i in range(2):
t = threading.Thread(target = fibs1,args =(35,))
t.start()
threads.append(t)
for t in threads:
t.join()
@cost
def inthread1():
for i in range(2):
t = threading.Thread(target=fibs1, args=(35,))
t.start()
main_thread = threading.currentThread()
for t in threading.enumerate():
if t is main_thread:
continue
t.join()
nothread()
inthread()
打印結果:
inthread cost:14.6728241444
2 Semaphore類 ——python對象訪問量的控制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 5 16:12:14 2017
@author: 80002419
"""
from threading import Thread, Semaphore
import time,threading
sema = Semaphore(3) # 定義一個信號量爲3的Semaphone對象,
#定義一個測試函數作爲,被訪問的對象
def test(tid):
with sema:
print("信號量:{0}".format(tid))
time.sleep(0.5)
print('release!')
thds = []
for i in range(6):
t = Thread(target = test,args=(i,))
t.start()
thds.append(t)
for t in thds:
t.join()
打印結果:
信號量:1
信號量:0
release!
信號量:0
release!
信號量:0
release!
信號量:0
release!
release!
release!
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 5 16:12:14 2017
@author: 80002419
"""
from threading import Thread, Lock
import time,threading
value = 0;
def changeValue():
global value
new = value + 1
time.sleep(0.001)#讓其它進程可以切換進來
value = new
thds = []
for _ in range(100):
t = Thread(target = changeValue)
t.start()
thds.append(t)
for t in thds:
t.join()
print(value)
打印結果:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Created on Mon Jun 5 16:12:14 2017
@author: 80002419
"""
from threading import Thread, Lock
import time,threading
value = 0
lock = Lock()
def changeValue():
global value
with lock:
new = value + 1
time.sleep(0.001)#讓其它進程可以切換進來
value = new
thds = []
for _ in range(100):
t = Thread(target = changeValue)
t.start()
thds.append(t)
for t in thds:
t.join()
print(value)
打印結果: