Python多執行緒學習

2021-07-10 19:04:58 字數 4867 閱讀 8090

首先了解一下單執行緒,在啊很多年前的ms -dos時代,作業系統處理問題都是單任務的,我想做聽**和看電影兩件事兒,那麼一定要先排一下順序。

from time import ctime,sleep

defmusic

():for i in range(2):

print

"i was listening to music. %s" %ctime()

sleep(1)

defmove

():for i in range(2):

print

"i was at the movies! %s" %ctime()

sleep(5)

if __name__ == '__main__':

music()

move()

print

"all over %s" %ctime()

#coding=utf-8

from time import ctime,sleep

defmusic

(func):

for i in range(2):

print

"i was listening to %s. %s" %(func,ctime())

sleep(1)

defmove

(func):

for i in range(2):

print

"i was at the %s! %s" %(func,ctime())

sleep(5)

if __name__ == '__main__':

music(u'今生你作伴')

move(u'阿凡達')

print

"all over %s" %ctime()

對music()和move()進行了傳參處理。體驗中國經典歌曲和歐美大片文化。

執行結果:

下面我們重點了解多執行緒是怎麼回事,科技在發展,時代在進步,我們的cpu也越來越快,cpu抱怨,p大點事兒佔了我一定時間,其實我同時幹多個活都沒有問題的;於是,作業系統就進入了多工時代。我們聽著**吃著火鍋的不再是夢想。

python提供了兩個模組來實現多執行緒thread 和threading ,thread 有一些缺點,在threading 得到了彌補,為了不浪費你和時間,所以我們直接學習threading 就可以了。

#coding=utf-8

import threading

from time import ctime,sleep

defmusic

(func):

for i in range(2):

print

"i was listening to %s. %s" %(func,ctime())

sleep(1)

defmove

(func):

for i in range(2):

print

"i was at the %s! %s" %(func,ctime())

sleep(5)

threads =

t1 = threading.thread(target=music,args=(u'愛情買賣',))

t2 = threading.thread(target=move,args=(u'阿凡達',))

if __name__ == '__main__':

for t in threads:

t.setdaemon(true)

t.start()

print

"all over %s" %ctime()

import threading
首先匯入threading模組,這是使用多執行緒的前提

threads = 

t1 = threading.thread(target=music,args=(u'今生你作伴',))

建立了threads陣列,建立執行緒t1,使用threading.thread()方法,在這個方法中呼叫music方法target=music,args方法對music進行傳參。 把建立好的執行緒t1裝到threads陣列中。

接著以同樣的方式建立執行緒t2,並把t2也裝到threads陣列。

for t in threads:

t.setdaemon(true)

t.start()

最後通過for迴圈遍歷陣列。(陣列被裝載了t1和t2兩個執行緒)

setdaemon()
setdaemon(true)將執行緒宣告為守護執行緒,必須在start() 方法呼叫之前設定,如果不設定為守護執行緒程式會被無限掛起。子執行緒啟動後,父執行緒也繼續執行下去,當父執行緒執行完最後一條語句print 「all over %s」 %ctime()後,沒有等待子執行緒,直接就退出了,同時子執行緒也一同結束。

start()
開始執行緒活動

從執行結果來看:

子執行緒(muisc 、move )和主線程(print 「all over %s」 %ctime())都是同一時間啟動,但由於主線程執行完結束,所以導致子執行緒也終止。

對上述程式稍作修改:

if __name__ == '__main__':

for t in threads:

t.setdaemon(true)

t.start()

t.join()

print

"all over %s"

%ctime()

我們只對上面的程式加了個join()方法,用於等待執行緒終止。join()的作用是,在子執行緒完成執行之前,這個子執行緒的父執行緒將一直被阻塞。

注意: join()方法的位置是在for迴圈外的,也就是說必須等待for迴圈裡的兩個程序都結束後,才去執行主程序。

從上面例子中發現執行緒的建立是頗為麻煩的,每建立乙個執行緒都需要建立乙個tx(t1、t2、…),如果建立的執行緒多時候這樣極其不方便。下面對通過例子進行繼續改進:

#coding=utf-8

from time import sleep, ctime

import threading

defsuper_player

(file,time):

for i in range(2):

print

'start playing: %s! %s' %(file,ctime())

sleep(time)

list =

threads =

files = range(len(list))

#建立執行緒

for file,time in list.items():

t = threading.thread(target=super_player,args=(file,time))

if __name__ == '__main__':

#啟動執行緒

for i in files:

threads[i].start()

for i in files:

threads[i].join()

#主線程

print

'end:%s' %ctime()

最後是執行緒啟動執行。執行結果:

建立自己的多執行緒類

#coding=utf-8

import threading

from time import sleep, ctime

class

mythread

(threading.thread):

def__init__

(self,func,args,name=''):

threading.thread.__init__(self)

self.name=name

self.func=func

self.args=args

defrun(self):

defsuper_play

(file,time):

for i in range(2):

print

'start playing: %s! %s' %(file,ctime())

sleep(time)

list =

#建立執行緒

threads =

files = range(len(list))

for k,v in list.items():

t = mythread(super_play,(k,v),super_play.__name__)

if __name__ == '__main__':

#啟動執行緒

for i in files:

threads[i].start()

for i in files:

threads[i].join()

#主線程

print

'end:%s' %ctime()

深入學習才會有意想不到的收穫,繼續努力,加油~

Python多執行緒學習

一 建立執行緒 1 通過thread模組中的start new thread func,args 建立執行緒 在eclipse pydev中敲出以下 coding utf 8 import thread def run thread n for i in range n print i thread...

python學習 多執行緒

示例 import threading import time def stuthread arg1,arg2 print threading.current thread getname 開始執行 print 引數為 s s arg1,arg2 time.sleep 1 暫停1s print th...

python學習 多執行緒

死鎖概念 程式執行的最小單元,依賴於程序 特點 建立 threading模組thread類建立乙個物件 import threading t threading.thread target 函式名,args 引數 t.start 互斥鎖 建立 threading模組lock類建立乙個物件import...