python中的多執行緒

2021-10-02 18:30:55 字數 4321 閱讀 7258

當python程式執行時會預設建立乙個主線程,除了主線程之外我們還可以建立別的執行緒,可以使用threading引入:

import threading

import time

defthinking()

:for i in

range(3

):# threading.current_thread()檢視當前正在執行的執行緒的名字

print

(str

(threading.current_thread())

+'am thinking'

) time.sleep(1)

defdrawing()

:for i in

range(3

):print

(str

(threading.current_thread())

+'am drawing'

) time.sleep(1)

defmain()

: t1 = threading.thread(target=thinking)

t2 = threading.thread(target=drawing)

# 開始執行執行緒

t1.start(

) t2.start(

)# 檢視當前的執行緒的數量

print

(threading.

enumerate()

)main(

)

如何使用類的方法引入多執行緒

import threading

import time

class

thinkingthread

(threading.thread)

:def

run(self)

:for i in

range(3

):# threading.current_thread()檢視當前正在執行的執行緒的名字

print

(str

(threading.current_thread())

+'am thinking'

) time.sleep(1)

class

drawingthread

(threading.thread)

:def

run(self)

:for i in

range(3

):print

(str

(threading.current_thread())

+'am drawing'

) time.sleep(1)

defmain()

: t1 = thinkingthread(

) t2 = drawingthread(

) t1.start(

) t2.start(

)main(

)

在多執行緒共享訪問全域性變數時,會出現讀髒資料的情況,需要引入鎖機制:threading.lock()

import threading

value =

0def

add_value()

:global value

for i in

range

(100000):

value +=

1print

(value)

defmain()

:for i in

range(2

):t = threading.thread(target=add_value)

t.start(

)

main(

)輸出:

100000

153852

import threading

value =

0lock = threading.lock(

)def

add_value()

:global value

lock.acquire(

)for i in

range

(100000):

value +=

1 lock.release(

)print

(value)

defmain()

:for i in

range(2

):t = threading.thread(target=add_value)

t.start(

)main(

)輸出:

100000

200000

threading.condition()類似threading.lock,可以修改全域性資料的時候進行上鎖,也可以修改完畢後進行解鎖,下列是常用的函式:

import threading

import random

import time

all_money =

1000

conditon_lock = threading.condition(

)times =

0class

producer

(threading.thread)

:def

run(self)

:global all_money

global times

while

true

: times = times +

1 conditon_lock.acquire(

)if times >10:

break

money = random.randint(1,

1000

) all_money = all_money + money

print

('{}生產了{}元,還剩於{}元'

.format

(threading.current_thread(

), money, all_money)

) conditon_lock.notify_all(

) conditon_lock.release(

) time.sleep(1)

class

consumer

(threading.thread)

:def

run(self)

:global all_money

global times

while

true

: money = random.randint(1,

1000

) conditon_lock.acquire(

)while all_money < money:

if times >=10:

conditon_lock.release(

)return

conditon_lock.wait(

) all_money = all_money-money

print

('{}消費了{}元,還剩於{}元'

.format

(threading.current_thread(

), money, all_money)

) conditon_lock.release(

)def

main()

:for i in

range(5

):t = producer(name=

"生產者{}"

.format

(i))

t.start(

)for i in

range(3

):t = consumer(name=

"消費者{}"

.format

(i))

t.start(

)main(

)

queue執行緒安全佇列

這些佇列都實現了鎖原語,能夠在多執行緒直接使用,可以使用佇列來實現執行緒間的同步,建立乙個先進先出佇列:

匯入:

from queue import queue

q = queue(

4)

gil全域性直譯器鎖

python中多執行緒 Python之多執行緒

python之多執行緒 一 概念 1 多工可以由多程序完成,也可以由乙個程序內的多執行緒完成。程序是由若干的執行緒組成,乙個程序至少有乙個程序。執行緒是作業系統直接支援的執行單元,天賜高階預壓通常都是內建多執行緒的支援,python的執行緒是真正的posix thread而不是模擬出來的執行緒。2 ...

python中的多執行緒

python中的多執行緒是假的多執行緒!為什麼這麼說,我們先明確乙個概念,全域性直譯器鎖 gil global interpreter lock python 的執行由python虛擬機器 直譯器 來控制,同時只有乙個執行緒在執行 對python虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...

python中的多執行緒是假的多執行緒

python中的多執行緒是假的多執行緒?為什麼這麼說,我們先明確乙個概念,全域性直譯器鎖 gil global interpreter lock python 的執行由python虛擬機器 直譯器 來控制,同時只有乙個執行緒在執行 對python虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...