當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 來控制,正是這...