[Python] 多线程同步问题——信箱传递

题目

有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 = 5
in_index, out_index = 0, 0
in_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)

def producer(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'{name}已经加入一个: {num}')
        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'{name}已经取得一个: {num}')
        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
...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值