python 多線程 聯繫代碼(Python核心編程裏面的例子)

先自定義一個線程的子類,這個跟Java很像,主要功能的實現實在run方法裏面


# -*- coding: utf8 -*- 
import threading
import time

class MyThread(threading.Thread):
    '''
        這個是自定義線程的子類
    '''
    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 'this is the method run starting %s at %s ' % (self.name,time.ctime())
        #用於當函數參數已經存在於一個元組或字典中時,間接地調用函數
        self.res = apply(self.func,self.args)
        print '%s finnishing at %s \n' % (self.name,time.ctime())

在寫一個測試的類,Python可以把方法傳到某個類裏面,這個比較神奇的


看代碼:


# -*- coding: utf8 -*- 
import time
import sys
import datetime

#在同一個目錄下面可以直接引用
import MyThread
def fib(x):
    time.sleep(0.05)
    if x<2:return 1
    return (fib(x-2) +fib(x-1))
def fac(x):
    time.sleep(0.1)
    if x<2:return 1
    return (x*fac(x-1))
def sum_(x):
    time.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))
    print '******SINGLE THREAD START******'
    Tstarttime = datetime.datetime.now()
    Sstarttime = datetime.datetime.now()
    for i in nfuncs:
        print 'start ',funcs[i].__name__,'at : ',\
              time.ctime()
        starttime = datetime.datetime.now()
        print funcs[i](n)
        endtime = datetime.datetime.now()
        print funcs[i].__name__,(endtime - starttime).seconds,'s'
        print funcs[i].__name__,'finnished ','at : ',\
              time.ctime()

    Sendtime = datetime.datetime.now()
    print 'SINGLE THREAD TIME ',(Sendtime - Sstarttime).seconds,'s'
    Mstarttime = datetime.datetime.now()
    print '******MULTIPLE THREAD START*****'
    threads = []#用來存放線程
    for i in nfuncs:
        #MyThread.MyThread,要注意,不要直接MyThread只是模塊,要引用到裏面的類才行,否則
        #報TypeError: 'module' object is not callable 錯誤
        t = MyThread.MyThread(funcs[i],(n,),funcs[i].__name__)
        threads.append(t)

    for i in nfuncs:
        threads[i].start()

    for i in nfuncs:
        #當前進程的其他線程調用了join方法之後,會阻塞當前進程等待其他線程執行完在往下執行,可以給join設置超時參數
        threads[i].join()
        print i
        print threads[i].getResult()
    Mendtime = datetime.datetime.now()
    
    print 'MULTIPLE THREAD TIME ',(Mendtime - Mstarttime).seconds,'s'
    Tendtime = datetime.datetime.now()
    print 'TOTAL TIME ',(Tendtime - Tstarttime).seconds,'s'
    print 'ALL DONE'

if __name__ == '__main__':
    main()


最後在看一下結果:


發佈了37 篇原創文章 · 獲贊 3 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章