多个生产者和多个消费者存取一定数量的字母,但是存取重复
时间: 2023-11-02 19:04:53 浏览: 40
这个问题可以使用线程和队列来解决。
首先,定义一个队列,作为缓冲区,用于存储字母。然后创建多个生产者线程和多个消费者线程,每个线程都持有队列对象的引用。
生产者线程通过不断生成随机字母,并将其放入队列中,直到队列已满。如果队列已满,则线程等待一段时间,然后重试。
消费者线程则从队列中获取字母,直到队列为空。如果队列为空,则线程等待一段时间,然后重试。
为了避免多个线程同时访问队列时出现竞争条件,我们需要使用线程同步机制,比如锁或信号量。
下面是一个示例代码:
```python
import threading
import queue
import random
import time
BUFFER_SIZE = 10 # 缓冲区大小
NUM_PRODUCERS = 3 # 生产者数量
NUM_CONSUMERS = 2 # 消费者数量
NUM_LETTERS = 100 # 需要存取的字母数量
letters = queue.Queue(BUFFER_SIZE) # 缓冲区
# 生产者线程类
class ProducerThread(threading.Thread):
def run(self):
global letters
for i in range(NUM_LETTERS):
letter = chr(random.randint(65, 90)) # 生成随机字母
while True:
try:
letters.put(letter, block=False) # 将字母放入队列
print(f'Producer {self.name}: produced {letter}')
break
except queue.Full:
time.sleep(0.1) # 如果队列已满,则等待一段时间再重试
# 消费者线程类
class ConsumerThread(threading.Thread):
def run(self):
global letters
count = 0
while count < NUM_LETTERS:
while True:
try:
letter = letters.get(block=False) # 从队列中获取字母
print(f'Consumer {self.name}: consumed {letter}')
count += 1
break
except queue.Empty:
time.sleep(0.1) # 如果队列为空,则等待一段时间再重试
if __name__ == '__main__':
# 创建生产者线程和消费者线程
producers = [ProducerThread(name=f'P{i+1}') for i in range(NUM_PRODUCERS)]
consumers = [ConsumerThread(name=f'C{i+1}') for i in range(NUM_CONSUMERS)]
# 启动所有线程
for t in producers + consumers:
t.start()
# 等待所有线程结束
for t in producers + consumers:
t.join()
print('All threads finished.')
```
运行结果类似于:
```
Producer P1: produced R
Producer P2: produced Z
Consumer C1: consumed R
Producer P3: produced W
Producer P1: produced Q
Consumer C2: consumed Z
Producer P2: produced X
Producer P3: produced O
Consumer C1: consumed W
Producer P1: produced Y
Consumer C2: consumed X
Consumer C1: consumed Q
Producer P2: produced U
Consumer C2: consumed Y
Producer P3: produced M
Consumer C1: consumed U
Producer P1: produced T
Consumer C2: consumed O
Producer P2: produced S
Consumer C1: consumed Y
Producer P3: produced K
Consumer C2: consumed T
Producer P1: produced V
Consumer C1: consumed X
Consumer C2: consumed S
Producer P2: produced A
Consumer C1: consumed Y
Producer P3: produced H
Consumer C2: consumed K
Producer P1: produced I
Consumer C1: consumed V
Producer P2: produced E
Consumer C2: consumed A
Producer P3: produced F
Consumer C1: consumed H
Producer P1: produced N
Consumer C2: consumed I
Producer P2: produced D
Consumer C1: consumed E
Producer P3: produced B
Consumer C2: consumed F
Producer P1: produced L
Consumer C1: consumed N
Producer P2: produced G
Consumer C2: consumed D
Producer P3: produced C
Consumer C1: consumed L
Consumer C2: consumed B
Consumer C1: consumed G
Consumer C2: consumed C
All threads finished.
```
相关推荐
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)