1. 程式人生 > >python多執行緒(2)--thread和threading模組的使用

python多執行緒(2)--thread和threading模組的使用

thread模組
python不推薦使用這個模組,推薦更高階的threading。
thread模組和物件

函式 描述
start_new_thread(function,args) 產生新執行緒,指定函式和引數
allocate_lock() 分配一個LockType型別的鎖物件
exit() 執行緒退出
LockType物件的方法
acquire() 嘗試獲取物件物件
locked 如果獲取了返回True否則返回False
release() 釋放鎖
thread.py

#coding:utf-8
import thread from time import sleep,ctime loops=[4,2]#睡眠時間 def loop(nloop,nsec,lock): print 'start loop',nloop,'at:',ctime() sleep(nsec) print 'loop',nloop,'done at:',ctime() lock.release()#釋放鎖物件 def main(): print 'starting at :',ctime() locks=[] nloops=range(len(loops))#建立nloops陣列
#建立鎖並加入組 for i in nloops: lock=thread.allocate_lock()#建立 lock (不能直接加入) lock.acquire()#嘗試獲取lock locks.append(lock)#加入組 for i in nloops: thread.start_new_thread(loop,(i,loops[i],locks[i]))#建立執行緒 #獲取鎖物件 成功True 失敗False for i in nloops: while
locks[i].locked():pass#如果鎖物件被釋放 表示解鎖了 可以繼續執行 print 'all DONE at:',ctime() if __name__ == '__main__': main()

輸出:

starting at : Tue Jul 19 20:23:29 2016
start loop start loop0  1at:  at:Tue Jul 19 20:23:29 2016 
Tue Jul 19 20:23:29 2016
loop 1 done at: Tue Jul 19 20:23:31 2016
loop 0 done at: Tue Jul 19 20:23:33 2016
all DONE at: Tue Jul 19 20:23:33 2016

Threading模組
提供除了thread以及其他同步機制,主要是thread類
Threading模組下的thread類的使用:

函式 描述
run() 通常需要重寫,編寫程式碼實現 做需要的功能。定義執行緒功能的函式
getName() 獲得執行緒物件名稱
setName() 設定執行緒物件名稱
start() 啟動執行緒
jion([timeout]) 等待另 一執行緒結束後再執行。timeout設定等待時間。
setDaemon(bool) 設定子執行緒是否隨主執行緒一起結束,必須在start()之前呼叫。預設為False。
isDaemon() 判斷執行緒是否隨主 執行緒一起結束。
isAlive() 檢查執行緒是否在執行中。

threading下的thread類的使用.py

#coding:utf-8
import threading
from time import sleep,ctime
loops=[4,2]

def loop(nloop,nsec):
    print 'start loop',nloop,'at:',ctime()
    sleep(nsec)
    print 'loop',nloop,'done at:',ctime()

def main():
    print 'starting at:',ctime()
    threads=[]
    nloops=range(len(loops))

    for i in nloops:#建立但不開始執行執行緒
        t=threading.Thread(target=loop,args=(i,loops[i]))
        threads.append(t)
    for i in nloops:#開始
        threads[i].start()
    for i in nloops:#讓主執行緒等待
        threads[i].join()
    print 'all DONE at:',ctime()

if __name__ == '__main__':
    main()

輸出:

starting at: Wed Jul 20 08:47:15 2016
start loop 0 at: Wed Jul 20 08:47:15 2016
start loop 1 at: Wed Jul 20 08:47:15 2016
loop 1 done at: Wed Jul 20 08:47:17 2016
loop 0 done at: Wed Jul 20 08:47:19 2016
all DONE at: Wed Jul 20 08:47:19 2016

重寫threading下的thread類:
1.先呼叫基類的構造器
2.重寫run()方法-(前面_call_())-。

#MyThread.py
#coding:utf-8
import threading
from time import ctime
class MyThread(threading.Thread):
    #類繼承
    '''
    def __int__(self,func,args,name=''):
        #建構函式
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args'''
    def __init__(self,func,args,name=''):
       threading.Thread.__init__(self)
       self.name = name
       self.func = func
       self.args = args

    def getResult(self):
        return self.res

    def run(self):
        print 'starting',self.name,'at:',ctime()
        self.res=apply(self.func,self.args)#執行函式 傳人函式和引數
        print self.name,'finished at:',ctime()

坑:是__init__不是__int__

使用自定義類:

# -*- coding:utf-8 -*-
from myThread import MyThread
from time import ctime, sleep
def fib(x):
    """求斐波那契數列之和"""
    sleep(0.005)
    if x < 2:
        return 1
    return fib(x-2) + fib(x-1)
def fac(x):
    """求階乘"""
    sleep(0.1)
    if x < 2:
        return 1
    return x * fac(x-1)
def sum_(x):
    """自然數累加和"""
    sleep(0.1)
    if x < 2:
        return 1
    return x + sum_(x-1)

funcs = [fib, fac, sum_]  # 將三個函式放到列表中
n = 12
def main():
    nfuncs = range(len(funcs))  # nfuncs = range(3)

    print '*** SINGLE THREAD'  # 單執行緒計算三個函式
    for i in nfuncs:
        print 'staring', funcs[i].__name__, 'at:', ctime()  # 打印出函式名稱,開始執行時間
        print funcs[i](n)  # 列印計算結果
        print funcs[i].__name__, 'finished at:', ctime()  # 打印出函式名稱,結束執行時間

    print '\n*** MULTIPLE THREADS'  # 多執行緒計算三個函式
    threads = []
    for i in nfuncs:
        t = MyThread(funcs[i], (n,), funcs[i].__name__)  # 例項化三個MyThread物件
        threads.append(t)  # 將三個物件放到列表中

    for i in nfuncs:
        threads[i].start()  # 啟動三個執行緒

    for i in nfuncs:
        threads[i].join()  # join()會等到執行緒結束或超時,即允許主執行緒等待執行緒結束
        print threads[i].getResult()  # 呼叫物件的getResult()方法

    print 'all DONE'

if __name__ == '__main__':  # 獨立執行指令碼,即在此指令碼在直接執行時,才會呼叫main()函式
    main()

輸出:

*** SINGLE THREAD
staring fib at: Wed Jul 20 10:57:21 2016
233
fib finished at: Wed Jul 20 10:57:23 2016
staring fac at: Wed Jul 20 10:57:23 2016
479001600
fac finished at: Wed Jul 20 10:57:24 2016
staring sum_ at: Wed Jul 20 10:57:24 2016
78
sum_ finished at: Wed Jul 20 10:57:25 2016

*** MULTIPLE THREADS
starting fib at: Wed Jul 20 10:57:25 2016
starting fac at: Wed Jul 20 10:57:25 2016
starting sum_ at: Wed Jul 20 10:57:25 2016
sum_ finished at: Wed Jul 20 10:57:27 2016
fac finished at: Wed Jul 20 10:57:27 2016
fib finished at: Wed Jul 20 10:57:28 2016
233
479001600
78

單執行緒一個一個執行,多執行緒一起執行,節省時間。