Python中的连续读/写线程同步

2024-06-01 19:17:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试实现读写器锁机制来控制3个线程的同步,每个线程根据随机抽取的骰子执行4次。例如,对于线程i,随机.randint(1,6)被调用,如果输出是偶数,则读取线程i,如果是奇数,则写入线程i。Here我找到了读写器锁的一般实现,但是我没有成功地为3个线程执行这4个操作。以下是原始代码的部分内容以及我在末尾添加的内容:

import threading
import time, random
class RWLock:
    def __init__(self):
        self.rwlock = 0
        self.writers_waiting = 0
        self.monitor = threading.Lock()
        self.readers_ok = threading.Condition(self.monitor)
        self.writers_ok = threading.Condition(self.monitor)
    def acquire_read(self):
        self.monitor.acquire()
        while self.rwlock < 0 or self.writers_waiting:
            self.readers_ok.wait()
        self.rwlock += 1
        self.monitor.release()
    def acquire_write(self):
        self.monitor.acquire()
        while self.rwlock != 0:
            self.writers_waiting += 1
            self.writers_ok.wait()
            self.writers_waiting -= 1
        self.rwlock = -1
        self.monitor.release()
    def release(self):
        self.monitor.acquire()
        if self.rwlock < 0:
            self.rwlock = 0
        else:
            self.rwlock -= 1
        wake_writers = self.writers_waiting and self.rwlock == 0
        wake_readers = self.writers_waiting == 0
        self.monitor.release()
        if wake_writers:
            self.writers_ok.acquire()
            self.writers_ok.notify()
            self.writers_ok.release()
        elif wake_readers:
            self.readers_ok.acquire()
            self.readers_ok.notifyAll()
            self.readers_ok.release()

rwl = RWLock()

class Reader(threading.Thread):
    def run(self):
        print "Thread " + str(threading.active_count()) + " is now ready for reading shard location\n"
        rwl.acquire_read()
        time.sleep(5)
        print "Thread " + str(threading.active_count()) + " now has finished reading shard location\n"
        rwl.release()
        time.sleep(0.2)
        self._is_running = False

class Writer(threading.Thread):
    def run(self):
        print "Thread " + str(threading.active_count()) + " is now ready to write to shard location\n"
        rwl.acquire_write()
        time.sleep(5)
        print "Thread " + str(threading.active_count()) + " now has finished writing to shard location\n"
        rwl.release()
        time.sleep(0.2)
        self._is_running = False

alpha = list("ABC")
d = {i: 4 for i in alpha}

def execute(thread):
    global d
    diceDraw = random.randint(1, 6)
    if diceDraw % 2 == 0:
        thread = Reader()
        thread.start()
        time.sleep(1)
    else:
        thread = Writer()
        thread.start()
        time.sleep(1)

while sum(d.values()) > 0:
    for i in d.keys():
        if i:
            execute(i)
            d[i] -= 1

有什么建议吗?在


Tags: selfreleasetimedefoksleep线程thread