Python 多執行緒

2021-07-27 22:35:41 字數 3605 閱讀 9323

python的標準庫提供了兩個模組:threadthreading,thread是低階模組,threading是高階模組,對thread進行了封裝。絕大多數情況下,我們只需要使用threading這個高階模組。

啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start()開始執行:

import time,threading

defloop

():print

'thread %s is running...'%threading.current_thread().name

n = 0

while n<5:

n= n+1

print

'thread %s >>> %s'%(threading.current_thread().name,n)

time.sleep(1)

print

'thread %s end.' %threading.current_thread().name

print

'thread %s in running...' % threading.current_thread().name

t = threading.thread(target = loop,name = 'loopthread')

t.start()

t.join()

print

'thread %s end.' %threading.current_thread().name

輸出結果:

thread mainthread is running…

thread loopthread is running…

thread loopthread >>> 1

thread loopthread >>> 2

thread loopthread >>> 3

thread loopthread >>> 4

thread loopthread >>> 5

thread loopthread ended.

thread mainthread ended.

由於任何程序預設就會啟動乙個執行緒,我們把該執行緒稱為主線程,主線程又可以啟動新的執行緒,python的threading模組有個current_thread()函式,它永遠返回當前執行緒的例項。主線程例項的名字叫mainthread,子執行緒的名字在建立時指定,我們用loopthread命名子執行緒。名字僅僅在列印時用來顯示,完全沒有其他意義,如果不起名字python就自動給執行緒命名為thread-1,thread-2……

import threading

# 3.lock

# 假定這是你的銀行存款:

balance = 0

lock = threading.lock()

defchange_it

(n):

# 先存後取,結果應該為0:

global balance

balance = balance + n

balance = balance - n

defrun_thread

(n):

for i in range(100000):

lock.acquire()

try:

change_it(n)

finally:

lock.release()

t1 = threading.thread(target=run_thread, args=(5,))

t2 = threading.thread(target=run_thread, args=(8,))

t1.start()

t2.start()

t1.join()

t2.join()

print balance

from random import randint

from time import sleep

from queue import queue

from mythread import mythread

defwriteq

(queue):

print

'producing object for q...',

queue.put('***', 1)

print

"size now", queue.qsize()

defreadq

(queue):

val = queue.get(1)

print

'consumed object from q... size now', \

queue.qsize()

defwriter

(queue, loops):

for i in range(loops):

writeq(queue)

sleep(randint(1, 3))

defreader

(queue, loops):

for i in range(loops):

readq(queue)

sleep(randint(2, 5))

funcs = [writer, reader]

nfuncs = range(len(funcs))

defmain

(): nloops = randint(2, 5)

q = queue(32)

threads =

for i in nfuncs:

t = mythread(funcs[i], (q, nloops), \

funcs[i].__name__)

for i in nfuncs:

threads[i].start()

for i in nfuncs:

threads[i].join()

print

'all done'

if __name__ == '__main__':

main()

starting writer at: mon mar 06 16:34:51 2017

add for q… size now= 1

starting reader at: mon mar 06 16:34:51 2017

sub from q… size now= 0

add for q… size now= 1

sub from q… size now= 0

add for q… size now= 1

add for q… size now= 2

writer finished at: mon mar 06 16:34:57 2017

sub from q… size now= 1

sub from q… size now= 0

reader finished at: mon mar 06 16:35:06 2017

all done

參考文獻:

python多執行緒 python多執行緒

通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...

python多執行緒詳解 Python多執行緒詳解

前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...

python程式多執行緒 PYTHON多執行緒

在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...