python 多執行緒

2021-10-03 08:02:30 字數 4504 閱讀 1279

執行緒

為啥要用多執行緒,一句話就是快,比如說乙個卡車有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(

)

建立多執行緒2
from 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分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...