Python多线程生产者消费者模型实现详解

Mia
Mia
发布时间:2026-10-13 | 5人浏览过
原创

本文通过Python代码详解经典的生产者与消费者线程同步问题。核心逻辑为缓冲池容量限制为1,利用Lock锁确保资源互斥访问。代码展示了多生产者与多消费者交替执行的过程,重点解析加锁、判断缓冲池状态及释放锁的操作流程,帮助理解并发编程中的资源同步机制。

本文通过一个完整的Python实例,详细讲解生产者与消费者问题的实现方法,供读者参考学习。

生产者和消费者问题是多线程同步的经典案例。假设存在一个缓冲池(此处使用列表模拟),生产者负责向其中添加数据,消费者负责从中取出数据。基本规则如下:当缓冲池为空时,生产者才能放入数据;当缓冲池非空时,消费者才能取出数据。为简化模型,设定缓冲池中最多仅能容纳一个产品。由于生产者和消费者共同操作同一资源(缓冲池),每次操作时必须获取锁对象以确保资源同步,操作完成后需释放锁。在Python中实现该逻辑需要继承Thread类,并获取锁对象,具体代码实现如下:

# -*- coding:utf-8 -*-
#! python2
from threading import Thread
from threading import Lock
import time,random
pro_list = []
lock = Lock()
class Producer(Thread):
  def run(self):
    global pro_list
    while True:
      i = random.randint(0, 100)
      lock.acquire()
      if len(pro_list) > 0:
        print "!--product still in list, wait consumer to get it.."
      else:
        pro_list.append(i)
        print ":::Producer put:", pro_list[0]
      lock.release()
      time.sleep(2)
class Consumer(Thread):
  def run(self):
    global pro_list
    while True:
      lock.acquire()
      if len(pro_list) == 0:
        print "!--No product now, wait producer put in..."
      else:
        print ":::Consumer fetch:", pro_list[0]
        pro_list.pop(0)
      lock.release()
      time.sleep(2)
Producer().start()
Producer().start()
Consumer().start()
Producer().start()
Producer().start()
Consumer().start()
Consumer().start()

以下代码示例使用了多个生产者线程和多个消费者线程共同操作缓冲池,部分执行结果展示如下:

:::Producer put: 78 !--product still in list, wait consumer to get it.. :::Consumer fetch: 78 :::Producer put: 99 !--product still in list, wait consumer to get it.. :::Consumer fetch: 99 !--No product now, wait producer put in... :::Producer put: 12 :::Consumer fetch: 12 :::Producer put: 91 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 91 !--No product now, wait producer put in... :::Producer put: 63 :::Consumer fetch: 63 :::Producer put: 85 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 85 !--No product now, wait producer put in... :::Producer put: 1 :::Consumer fetch: 1 :::Producer put: 26 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 26 !--No product now, wait producer put in... :::Producer put: 8 :::Consumer fetch: 8 :::Producer put: 19 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 19 !--No product now, wait producer put in... :::Producer put: 74 !--product still in list, wait consumer to get it.. :::Consumer fetch: 74 :::Producer put: 50 !--product still in list, wait consumer to get it.. :::Consumer fetch: 50 !--No product now, wait producer put in... :::Producer put: 97 :::Consumer fetch: 97 :::Producer put: 69 !--product still in list, wait consumer to get it.. !--product still in list, wait consumer to get it.. :::Consumer fetch: 69 !--No product now, wait producer put in... :::Producer put: 41 !--product still in list, wait consumer to get it.. :::Consumer fetch: 41 :::Producer put: 6 !--product still in list, wait consumer to get it.. :::Consumer fetch: 6 !--No product now, wait producer put in...

如果您对Python编程感兴趣,可进一步查阅本站相关专题,包括《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python数学运算技巧总结》。

希望本文提供的代码示例和解析对您的Python程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表