一个线程写AAA,一个线程写BBB
import threading
import time
# 创建一个锁对象
lock = threading.Lock()
# 定义线程函数,写入A或B
def write_letter(letter):
global lock
for i in range(10):
with lock:
print(letter * 3) # 打印10个字母
time.sleep(0.5) # 模拟写入操作所需时间
# 创建两个线程,一个写A,一个写B
thread_A = threading.Thread(target=write_letter, args=("A",))
thread_B = threading.Thread(target=write_letter, args=("B",))
# 启动线程
thread_A.start()
thread_B.start()
结果
AAA
BBB
BBB
AAA
BBB
AAA
AAA
BBB
AAA
BBB
AAA
BBB
AAA
BBB
AAA
BBB
AAA
BBB
AAA
BBB
生产者-消费者问题
import threading
import time
import random
from queue import Queue
# 共享队列,使用queue.Queue来实现线程安全
shared_queue = Queue(maxsize=10)
# 消费者线程函数
def consumer():
while True:
item = shared_queue.get() # 从队列中获取一个元素
print(f'Consumer processed: {item}')
time.sleep(random.uniform(0.1, 0.5)) # 模拟处理时间
shared_queue.task_done() # 通知队列该任务已处理完成
# 生产者线程函数
def producer(shared_queue):
for i in range(20):
time.sleep(random.uniform(0.1, 0.5)) # 模拟生产时间
item = i # 生产一个数据项
print(f'Producer produced: {item}')
shared_queue.put(item) # 将数据项放入队列
# 创建消费者线程
consumer_thread = threading.Thread(target=consumer, daemon=True)
consumer_thread.start()
# 创建生产者线程
producer_thread = threading.Thread(target=lambda: producer(shared_queue))
producer_thread.start()
# 等待生产者线程完成
producer_thread.join()
# 等待所有队列中的任务被处理完成
shared_queue.join()
Producer produced: 0
Consumer processed: 0
Producer produced: 1
Consumer processed: 1
Producer produced: 2
Consumer processed: 2
Producer produced: 3
Consumer processed: 3
Producer produced: 4
Consumer processed: 4
Producer produced: 5
Producer produced: 6
Consumer processed: 5
Producer produced: 7
Consumer processed: 6
Producer produced: 8
Producer produced: 9
Consumer processed: 7
Producer produced: 10
Consumer processed: 8
Producer produced: 11
Consumer processed: 9
Producer produced: 12
Consumer processed: 10
Producer produced: 13
Consumer processed: 11
Consumer processed: 12
Producer produced: 14
Producer produced: 15
Consumer processed: 13
Consumer processed: 14
Producer produced: 16
Consumer processed: 15
Producer produced: 17
Producer produced: 18
Consumer processed: 16
Producer produced: 19
Consumer processed: 17
Consumer processed: 18
Consumer processed: 19