3.读者与写者问题

该代码示例展示了如何使用Python的多线程和信号量Semaphore解决经典的读者写者问题。在读者写者问题中,多个读者可以同时读取资源,但当有写者时,所有读者和写者都不能访问。代码创建了reader和writer函数,它们分别模拟读者和写者的操作,通过信号量进行同步和互斥。随机生成的进程列表决定是启动读者线程还是写者线程,以演示并发执行情况。
摘要由CSDN通过智能技术生成

import time
import threading
from threading import Semaphore
import random
Rcount = 0  
Wcount = 0  
Wmutex = Semaphore(1)  
Rmutex = Semaphore(1)  
File = Semaphore(1) 
Wirte = Semaphore(1)  


def reader(i):
    print('reader'+str(i)+' waiting to read\n', end='')
    Wirte.acquire()
    Rmutex.acquire()
    global Rcount
    if Rcount == 0:
        File.acquire()
    Rcount += 1
    Rmutex.release()
    Wirte.release()
    print('reader'+str(i)+' reading\n', end='')
    time.sleep(random.randint(1, 5))
    print('reader'+str(i)+' finish read\n', end='')
    Rmutex.acquire()
    Rcount -= 1
    if Rcount == 0:
        File.release()
    Rmutex.release()


def writer(i):
    print('writer'+str(i)+' waiting to write\n', end='')
    Wmutex.acquire()
    global Wcount
    if Wcount == 0:
        Wirte.acquire()
    Wcount += 1
    Wmutex.release()
    File.acquire()
    print('writer'+str(i)+' writing\n', end='')
    time.sleep(random.randint(1, 5))
    print('writer'+str(i)+' finish write\n', end='')
    File.release()
    Wmutex.acquire()
    Wcount -= 1
    if Wcount == 0:
        Wirte.release()
    Wmutex.release()


if __name__ == '__main__':
    times = 10
    rwlist = []
    for _ in range(times):
        rwlist.append(random.randint(0, 1))
    print(rwlist)
    print('其中1表示读者进程,0表示写者进程')
    rindex = 1
    windex = 1
    for i in rwlist:
        if i == 1:
            t = threading.Thread(target=reader, args=(rindex, ))
            rindex += 1
            t.start()
        else:
            t = threading.Thread(target=writer, args=(windex, ))
            windex += 1
            t.start()

读者与写者问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值