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 開執行緒的 ...