有n個執行緒,向同乙個信箱(信箱的大小為k)裡傳遞訊息,放入的訊息為數字i(i=1…n),有m個執行緒從信箱裡取數字,取出來將數字*10並列印。
"""
有n個執行緒,向同乙個信箱(信箱的大小為k)裡傳遞訊息,放入的訊息為數字i(i=1...n),有m個執行緒從信箱裡取數字,取出來將數字*10並列印。
"""import time
import random
from threading import thread, semaphore, lock
list_len =
5in_index, out_index =0,
0in_lock, out_lock, output_lock = lock(
), lock(
), lock(
)message_list =[0
for x in
range
(list_len)
]full_semaphore, empty_semaphore = semaphore(0)
, semaphore(list_len)
defproducer
(name, num:
int)
:global in_index, in_lock, output_lock, list_len, message_list, full_semaphore, empty_semaphore
print
(name,
id(message_list)
)while
true
: time.sleep(random.randint(1,
5)) empty_semaphore.acquire(
) in_lock.acquire(
) message_list[in_index]
= num
in_index =
(in_index +1)
% list_len
in_lock.release(
) full_semaphore.release(
) output_lock.acquire(
)print
(f'已經加入乙個: '
) output_lock.release(
)def
consumer
(name)
:global out_index, out_lock, output_lock, list_len, message_list, full_semaphore, empty_semaphore
print
(name,
id(message_list)
)while
true
: time.sleep(random.randint(1,
5)) full_semaphore.acquire(
) out_lock.acquire(
) num = message_list[out_index]*10
out_index =
(out_index +1)
% list_len
out_lock.release(
) empty_semaphore.release(
) output_lock.acquire(
)print
(f'已經取得乙個: '
) output_lock.release(
)if __name__ ==
'__main__'
: p1, p2, p3 = thread(target=producer, args=
('producer-1 ',1
,)), thread(target=producer, args=
('producer-2 ',2
,)), \
thread(target=producer, args=
('producer-3 ',3
,)) c1, c2 = thread(target=consumer, args=
('consumer-1 ',)
), thread(target=consumer, args=
('consumer-2 ',)
) p1.start(
) p2.start(
) p3.start(
) c1.start(
) c2.start(
)
輸出:
producer-1 2432159404616
producer-2 2432159404616
producer-3 2432159404616
consumer-1 2432159404616
consumer-2 2432159404616
producer-1 已經加入乙個: 1
producer-2 已經加入乙個: 2
consumer-1 已經取得乙個: 10
producer-3 已經加入乙個: 3
consumer-1 已經取得乙個: 20
consumer-2 已經取得乙個: 30
producer-1 已經加入乙個: 1
producer-2 已經加入乙個: 2
producer-1 已經加入乙個: 1
consumer-1 已經取得乙個: 10
consumer-2 已經取得乙個: 20
producer-3 已經加入乙個: 3
producer-2 已經加入乙個: 2
producer-2 已經加入乙個: 2
producer-1 已經加入乙個: 1
consumer-2 已經取得乙個: 10
producer-3 已經加入乙個: 3
consumer-1 已經取得乙個: 30
producer-3 已經加入乙個: 3
consumer-2 已經取得乙個: 20
producer-2 已經加入乙個: 2
consumer-1 已經取得乙個: 20
producer-3 已經加入乙個: 3
consumer-2 已經取得乙個: 10
producer-1 已經加入乙個: 1
consumer-1 已經取得乙個: 30
producer-3 已經加入乙個: 3
consumer-2 已經取得乙個: 30
producer-2 已經加入乙個: 2
...
多執行緒同步問題
在應用程式中使用多個執行緒的乙個好處是每個執行緒都可以非同步執行。對於 windows 應用程式,耗時的任務可以在後台執行,而使應用程式視窗和控制項保持響應。對於伺服器應用程式,多執行緒處理提供了用不同執行緒處理每個傳入請求的能力。否則,在完全滿足前乙個請求之前,將無法處理每個新請求。然而,執行緒的...
多執行緒同步問題
有四個執行緒1,2,3,4,執行緒1的功能就是輸出1,執行緒2的功能就是輸出2,以此類推.現在有四個檔案.abcd.初始都為空.現要讓四個檔案呈如下格式 a 1 2 3 4 1 2.b 2 3 4 1 2 3.c 3 4 1 2 3 4.d 4 1 2 3 4 1.設計程式.include sys ...
多執行緒 同步問題
我們先看個錯誤示例。功能 宣告乙個數字並賦值10000.然後讓1w個執行緒去減少1,1w個執行緒去增加1。理論上說,加一萬減一萬,最後數字的結果並不會改變。class errordemo 釋放object的方法 synchronized 塊結束或者異常丟擲。使用synchronized後的 publ...