執行緒
為啥要用多執行緒,一句話就是快,比如說乙個卡車有10個輪子,是乙個人打氣快還是十個人打氣快,這裡的人就是執行緒
建立多執行緒1
python中線程有好幾個包,thread _thread threading三種,現在python3常用的為threading
from threading import thread
import time
# 建立執行緒的第一種方法
deffun
(text)
: time.sleep(2)
print
(text)
# 多執行緒跑
defrun_multi()
: s_time = time.time(
) t1 = thread(target=fun, args=
("1",)
) t2 = thread(target=fun, args=
("2",)
) t1.start(
)# 啟動執行緒
t2.start(
) t1.join(
)# 執行緒加入,目的是讓主線程等待該執行緒完畢在執行主線程
t2.join(
) e_time = time.time(
)print
(f"run_multi total cost time: "
)# 單執行緒跑
defrun()
: s_time = time.time(
) fun(
"1")
fun(
"2")
e_time = time.time(
)print
(f"run total cost time: "
)if __name__ ==
"__main__"
:# 對比第一種建立方式區別
run(
) run_multi(
)
建立多執行緒2from threading import thread
import time
# 建立執行緒的第二種方法
## 為什麼有了第一種建立方法還要有第二種呢,第二種繼承thread,可以重寫很多地方,更加靈活,能夠提公升效率
class
mythread
(thread)
:def
__init__
(self, text)
:super()
.__init__(
)## 繼承的順序,super的用法
self.text = text
defrun(self)
:# 這裡必須重寫run方法
time.sleep(2)
print
(self.text)
if __name__ ==
"__main__"
: t1 = mythread(
"1")
t2 = mythread(
"2")
t1.start(
) t2.start(
) t1.join(
) t2.join(
)print
("end"
)# 這裡可以嘗試注釋掉join方法,看看情況有啥區別,後面會講到
以上為多執行緒無返回值
建立多執行緒1(有返回值)
這種方式沒有返回值的方法,只能把結果存到資料結構中
from threading import thread
import time
from queue import queue
q = queue(
)def
fun(i)
: time.sleep(2)
q.put(i**2)
defrun_multi()
: t1 = thread(target=fun, args=(1
,)) t2 = thread(target=fun, args=(2
,)) t1.start(
) t2.start(
) t1.join(
) t2.join(
)while
not q.empty():
print
(q.get())
if __name__ ==
"__main__"
: run_multi(
)
建立多執行緒2(有返回值)
用執行緒池建立執行緒,然後獲取返回值
from threading import thread
from concurrent.futures import threadpoolexecutor, as_completed
import time
deffun
(i):
time.sleep(2)
return
str(i **2)
defrun_multi()
:with threadpoolexecutor(max_workers=5)
as executor:
futures =
[executor.submit(fun, i)
for i in
range
(100)]
# 無序
for future in as_completed(futures)
:print
(future.result())
print
("end"
)# 有序
for future in futures:
print
(future.result())
print
("end"
)if __name__ ==
'__main__'
: run_multi(
)
無返回值執行緒池from concurrent.futures import threadpoolexecutor, as_completed, wait, all_completed
import time
deffun
(i):
time.sleep(2)
print
(str
(i**2)
)return
str(i **2)
defrun_multi()
:with threadpoolexecutor(max_workers=5)
as executor:
futures =
[executor.submit(fun, i)
for i in
range(25
)]wait(futures, return_when=all_completed)
print
("end"
)if __name__ ==
'__main__'
: run_multi(
)
執行緒的幾個概念
start 執行緒啟動
join
daemon
join
可以在前面幾個例子中看到,如果不加join,那麼主線程結束後,子執行緒才結束;如果加上那麼主線程就得等待子執行緒結束,再繼續執行
join()的作用就是:等待子執行緒執行完畢後再執行主線程參考
daemon
一句話解釋:當主線程結束時改執行緒該不該結束,true為結束
想要理解上面這段話就得知道程式執行時執行緒時,執行緒是如何執行的
from threading import thread
import time
deffun()
:print
("thread start......"
) time.sleep(1)
print
("thread end...."
)def
run():
t = thread(name=
"t1"
, target=fun, args=()
) t.setdaemon(
true
)# 可以注釋下這行試試,看看效果
t.start(
)print
("end"
)if __name__ ==
'__main__'
: run(
)
如果你已經試了注釋的效果,你就會發現run方法已經執行完後,t1執行緒才執行完;但是如果注釋掉就執行不完了
同時消費乙個list,資料衝突,怎麼解決
答案就是加鎖
鎖的種類:
from threading import thread, lock
python多執行緒 python多執行緒
通常來說,多程序適用於計算密集型任務,多執行緒適用於io密集型任務,如網路爬蟲。關於多執行緒和多程序的區別,請參考這個 下面將使用python標準庫的multiprocessing包來嘗試多執行緒的操作,在python中呼叫多執行緒要使用multiprocessing.dummy,如果是多程序則去掉...
python多執行緒詳解 Python多執行緒詳解
前言 由於最近的工作中一直需要用到python去處理資料,而在面對大量的資料時,python多執行緒的優勢就展現出來了。因而藉此機會,盡可能詳盡地來闡述python多執行緒。但對於其更底層的實現機制,在此不做深究,僅是對於之前的一知半解做個補充,也希望初學者能夠通過這篇文章,即便是照葫蘆畫瓢,也能夠...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...