importthreading
import
time
"""python的thread模組是比較底層的模組,python的threading模組是對thread做了一些包裝的,可以更加方便的被使用
多執行緒程式的執行順序是不確定的,當執行緒被阻塞(blocked)時,執行緒掛起,阻塞結束後,執行緒進入就緒(runnable)狀態,等待排程。
而執行緒排程將自行選擇乙個執行緒執行。只能保證每個執行緒都執行完整個run函式,但是執行緒的啟動順序、run函式中每次迴圈的執行順序都不能確定。
也就是說:
1.每個執行緒預設有乙個名字,儘管上面的例子中沒有指定執行緒物件的name,但是python會自動為執行緒指定乙個名字。
2.當執行緒的run()方法結束時該執行緒完成。
3.無法控制線程排程程式,但可以通過別的方式來影響執行緒排程的方式。
"""g_num =0
deftest_thread_1():
print("
test_thread_1 子執行緒被呼叫, 休眠2秒")
time.sleep(2)
print("
test_thread_1 子執行緒執行結束")
deftest_mutex_1(mutex, num):
#宣告使用全域性變數
global
g_num
for i in
range(num):
if mutex.acquire(true): #
上鎖,true表示進行堵塞,也就是說如果上鎖失敗,就阻塞在這一步,直到上鎖成功
g_num += 1
#釋放鎖mutex.release()
deftest_mutex_2(mutex, num):
#宣告使用全域性變數
global
g_num
for i in
range(num):
if mutex.acquire(true): #
上鎖,true表示進行堵塞,也就是說如果上鎖失敗,就阻塞在這一步,直到上鎖成功
g_num += 1
#釋放鎖mutex.release()
class mythread(threading.thread): #
繼承自threading.thread類
"""為了讓每個執行緒的封裝性更完美,所以使用threading模組時,往往會定義乙個新的子類class,
只要繼承threading.thread就可以了,然後重寫run方法
"""#
重寫run方法
defrun(self):
#name屬性,當前執行緒的名字
print("
自己封裝的執行緒類,當前執行緒名字:%s
" %self.name)
#python的threading.thread類有乙個run方法,用於定義執行緒的功能函式,
#可以在自己的執行緒類中覆蓋該方法。而建立自己的執行緒例項後,通過thread類的start方法,
#可以啟動該執行緒,交給python虛擬機器進行排程,當該執行緒獲得執行的機會時,就會呼叫run方法執行執行緒。
defmake_thread():
#將函式引用使用target命名引數進行傳遞,建立子執行緒
thread = threading.thread(target=test_thread_1)
#啟動子執行緒
thread.start()
# 自定義的執行緒類
my_thread =mythread()
my_thread.start()
#建立乙個互斥鎖
#這個鎖預設是未上鎖的狀態
mutex =threading.lock()
t1 = threading.thread(target=test_mutex_1, args=(mutex, 1000000, ))
t1.start()
t2 = threading.thread(target=test_mutex_2, args=(mutex, 1000000, ))
t2.start()
#預設情況下,主線程會等待子執行緒
#t1 執行緒阻塞, 當t1完成執行後再進行下一步操作
#t1.join()
#t1 執行緒守護主線程
#t1.daemon = true
#獲取當前程序下的所有執行緒數量(包含主線程)
#length = len(threading.enumerate())
#print("執行緒數量:%d" % length)
#print("主線程執行到最後一行")
while
true:
length =len(threading.enumerate())
if length == 1:
return
g_num
else
: time.sleep(0.2)
num =make_thread()
print(num)
輸出:
test_thread_1 子執行緒被呼叫, 休眠2秒自己封裝的執行緒類,當前執行緒名字:thread-2test_thread_1 子執行緒執行結束
2000000
Python多執行緒,併發
單執行緒程式只有乙個 手指 但多執行緒的程式有多個 手指 每個 手指 仍然移動到控制流語句定義的下一行 但這些 手指 可以在程式的不同地方,同時執行不同的 行 你可以使用 python 的threading 模組,在單獨的執行緒中執行延遲或安排的 這個單獨的執行緒將因為 time.sleep 呼叫而...
python併發程式設計 多執行緒 執行緒理論
一 什麼是執行緒 在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程 執行緒顧名思義,就是一條流水線工作的過程 流水線的工作需要電源,電源就相當於cpu 而一條流水線必須屬於乙個車間,乙個車間的工作過程是乙個程序,車間負責把資源整合到一起,是乙個資源單位,而乙個車間內至少有一條流水線...
多執行緒併發
多執行緒併發主要有3個方面 1 同步器 主要有synchronized,reentrantlock 訊號量,門栓 countdownlatch 障柵 cyclicbarrier 交換器。2 同步容器 主要包括 對映 集 佇列 對映 concurrenthashmap,concurrentskipli...