Python學習 之 執行緒

2021-10-08 05:36:13 字數 4863 閱讀 2879

from threading import thread

import time

import random

# 用於併發執行的函式

deftask

(num)

: time.sleep(random.randint(1,

3))print

(num)

if __name__ ==

"__main__"

:# 建立乙個用於存放執行緒的 list

# 這種寫法如果建立的執行緒過多, 可能會把效能打死, 所以後續有了執行緒池的概念

l =# 如果不是, 可以建立乙個引數列表(想法供參考)

for i in

range(1

,6):

t = thread(target=task, args=

(i,)

)# 將執行緒啟動

t.start(

)# 阻塞到所有執行緒執行完成

for i in l:

i.join(

)print

("end"

)

from threading import thread

import time

import random

class

t(thread)

:def

__init__

(self, num)

:super()

.__init__(

) self.num = num

self.result =

none

# 類中方法開併發會找 run 函式

defrun

(self)

: time.sleep(random.randint(1,

3)) self.result = self.num **

2# 取返回值的方法

defget_result

(self)

:return self.result

if __name__ ==

'__main__'

: l =

for i in

range(5

):t = t(i)

t.start(

)for i in l:

i.join(

)# 輸出返回值

for i in l:

print

(i.get_result())

print

("end"

)

# 前後**省略, 使用 t.daemon = true 設定執行緒為守護執行緒

t = thread(target=***)

t.daemon =

true

""" 當主線程**所有資源之後, 守護執行緒才會結束 """

from threading import thread

import time

import random

# 用於模擬執行任務

deftask()

:# 模擬執行 5 次

for i in

range(5

):time.sleep(random.randint(1,

3))print

("%s finish"

% i)

# 作為守護執行緒

defcheck()

:while

true

:print

("still alive.."

) time.sleep(

0.5)

if __name__ ==

"__main__"

: t = thread(target=task)

d = thread(target=check)

d.daemon =

true

t.start(

) d.start(

)# 如果需要等待 task 執行完畢在結束主線程, 則要設定 t.join()

t.join(

)print

("end"

)

from threading import thread, lock

import time

deftask()

:# 區別3: 使用全域性變數

global n

# 區別4: 基於鎖去做處理

with mutex:

print

(n) time.sleep(

0.1)

# 模擬計算耗時

n -=

1if __name__ ==

"__main__"

:# 區別1: 引入乙個鎖

mutex = lock(

) l =

# 區別2: 定義 global 變數

n =100for i in

range

(n):

t = thread(target=task)

t.start(

)for i in l:

i.join(

)print

("end"

)

from threading import thread, semaphore, current_thread

import time, random

sm = semaphore(5)

deftask()

:with sm:

print

("%s is laing"

% current_thread(

).getname())

time.sleep(random.randint(1,

3))# time.sleep(1)

if __name__ ==

"__main__"

:for i in

range(20

):t = thread(target=task)

t.start(

)

from threading import thread, event

import time

defcheck()

:print

("checking mysql..."

)# 5 秒後, event 物件狀態設定為 true

time.sleep(5)

print

("check complate"

) e.

set(

)# 只有當事件狀態為 true 時, 才能執行, 否則會重試

defconn()

:# 重試 3 次, 計數器置為 1

count =

1# 如果事件狀態為 false

while

not e.is_set():

# 如果重試次數超過3次, 報錯

if count >3:

raise timeouterror(

"超時"

)# 如果不超過3次, 設定事件等待時間, 且計數器+1

print

("try to connect mysql time %s"

% count)

e.wait(2)

count +=

1# 如果時間狀態為true(e.set())執行下邊的**

print

("connect complate"

)if __name__ ==

"__main__"

:# 例項化乙個事件物件

e = event(

)# 列印此時事件的狀態, isset = is_set

print

(e.is_set())

# 起乙個執行緒, 模擬狀態變化

t1 = thread(target=check)

t1.start(

) t2 = thread(target=conn, name=

"t2"

) t3 = thread(target=conn, name=

"t3"

) t2.start(

) t3.start(

)# 重置訊號為 false

e.clear(

)

from threading import timer

import time

defhello

(i, name)

: time.sleep(i)

print

(name)

if __name__ ==

'__main__'

: l =

# 等待 2 秒, 睡 3 秒

t1 = timer(

2, hello, args=(3

,"tim"))

# 等待 3 秒, 睡 2 秒

t2 = timer(

3, hello, args=(2

,"tom"))

# 等待 1 秒, 睡 1 秒

t3 = timer(

1, hello, args=(1

,"sam"))

for i in l:

i.start(

)for i in l:

i.join(

)print

("end"

)

python之執行緒學習(二)

執行緒同步 多工版udp聊天 當多個程序幾乎同時修改某乙個共享資料時,我們需要進行同步控制,否則會造成讀髒資料 示例import threading import time defa x,mutex global num 上鎖 mutex.acquire for i in range x num 1...

python之執行緒

前言 python的thread模組是比較底層的模組,python的threading模組是對thread做了一些包裝的,可以更加方便的被使用 實現執行緒的方法 使用threading模組import threading import time 注意 在寫迴圈的時候for i in range 5 ...

python之執行緒

程序和執行緒都是虛擬單位,只是為了我們更加方便的描述問題 3.1 方式一 from threading import thread import time def task name print f is running time.sleep 1 print f is stopping 開執行緒的 ...