Maison >développement back-end >Tutoriel Python >Exemples de code montrant comment Python simule le modèle producteur-consommateur
Cet article présente principalement des informations pertinentes pour une explication détaillée d'exemples de simulation Python pour implémenter le modèle producteur-consommateur. Les connaissances sur les threads, les files d'attente et les boucles sont utilisées ici. Les amis dans le besoin peuvent se référer à
Détaillé. explication Un exemple de Python simulant la mise en œuvre du modèle producteur-consommateur
Sanxian utilise python3.4 pour simuler un exemple de producteur et de consommateur Les connaissances utilisées incluent les threads, les files d'attente, les boucles, etc. est le suivant :
Code Python
import queue import time import threading import random q=queue.Queue(5) #生产者 def pr(): name=threading.current_thread().getName() print(name+"线程启动......") for i in range(100): t=random.randint(2,9) print(name,"睡眠时间: ",t) time.sleep(t); d="A"+str(i) print(name+"正在存第",i+1,"个数据: ",d) #q.put("A"+str(i),False,2000) q.put(d) print("生产完毕!") #消费者 def co(): name=threading.current_thread().getName() time.sleep(1) print(name+"线程启动......") while True: print(name+"检测到队列数量: ",q.qsize()) t=random.randint(2,9) print(name,"睡眠时间: ",t) data=q.get(); print(name+"消费一个数据: ",data) p=threading.Thread(target=pr,name="生产者") c=threading.Thread(target=co,name="消费者1") c2=threading.Thread(target=co,name="消费者2") p.start() c.start() c2.start()
Dans cet exemple, Sanxian a démarré 1 thread producteur et 2 threads consommateurs. L'effet d'impression est le suivant. :
Code Python
生产者线程启动...... 生产者 睡眠时间: 4 消费者1线程启动...... 消费者1检测到队列数量: 0 消费者1 睡眠时间: 2 消费者2线程启动...... 消费者2检测到队列数量: 0 消费者2 睡眠时间: 3 生产者正在存第 1 个数据: A0 生产者 睡眠时间: 9 消费者1消费一个数据: A0 消费者1检测到队列数量: 0 消费者1 睡眠时间: 8 生产者正在存第 2 个数据: A1 生产者 睡眠时间: 5 消费者2消费一个数据: A1 消费者2检测到队列数量: 0 消费者2 睡眠时间: 7 生产者正在存第 3 个数据: A2 生产者 睡眠时间: 8 消费者1消费一个数据: A2 消费者1检测到队列数量: 0 消费者1 睡眠时间: 2 生产者正在存第 4 个数据: A3 生产者 睡眠时间: 7 消费者2消费一个数据: A3 消费者2检测到队列数量: 0 消费者2 睡眠时间: 9 生产者正在存第 5 个数据: A4 生产者 睡眠时间: 2 消费者1消费一个数据: A4 消费者1检测到队列数量: 0 消费者1 睡眠时间: 5 生产者正在存第 6 个数据: A5 生产者 睡眠时间: 5 消费者2消费一个数据: A5 消费者2检测到队列数量: 0 消费者2 睡眠时间: 6 生产者正在存第 7 个数据: A6 生产者 睡眠时间: 7 消费者1消费一个数据: A6 消费者1检测到队列数量: 0 消费者1 睡眠时间: 7 生产者正在存第 8 个数据: A7 生产者 睡眠时间: 3 消费者2消费一个数据: A7 消费者2检测到队列数量: 0 消费者2 睡眠时间: 8 生产者正在存第 9 个数据: A8 生产者 睡眠时间: 2 消费者1消费一个数据: A8 消费者1检测到队列数量: 0 消费者1 睡眠时间: 4 生产者正在存第 10 个数据: A9 生产者 睡眠时间: 4 消费者2消费一个数据: A9 消费者2检测到队列数量: 0 消费者2 睡眠时间: 5 生产者正在存第 11 个数据: A10 生产者 睡眠时间: 2 消费者1消费一个数据: A10 消费者1检测到队列数量: 0 消费者1 睡眠时间: 3 生产者正在存第 12 个数据: A11 生产者 睡眠时间: 3 消费者2消费一个数据: A11 消费者2检测到队列数量: 0 消费者2 睡眠时间: 3 生产者正在存第 13 个数据: A12 生产者 睡眠时间: 3 消费者1消费一个数据: A12 消费者1检测到队列数量: 0 消费者1 睡眠时间: 3 生产者正在存第 14 个数据: A13 生产者 睡眠时间: 8 消费者2消费一个数据: A13 消费者2检测到队列数量: 0 消费者2 睡眠时间: 7 生产者正在存第 15 个数据: A14 生产者 睡眠时间: 3 消费者1消费一个数据: A14 消费者1检测到队列数量: 0 消费者1 睡眠时间: 7 生产者正在存第 16 个数据: A15 生产者 睡眠时间: 2 消费者2消费一个数据: A15 消费者2检测到队列数量: 0 消费者2 睡眠时间: 9
À partir de cet exemple, nous avons constaté qu'il est très simple et pratique d'utiliser des files d'attente pour la synchronisation en plus des files d'attente. , Il existe également plusieurs méthodes pratiques comme suit :
Présentation des méthodes couramment utilisées dans ce package :
Queue.qsize() 返回队列的大小 Queue.empty() 如果队列为空,返回True,反之False Queue.full() 如果队列满了,返回True,反之False Queue.full 与 maxsize 大小对应 Queue.get([block[, timeout]])获取队列,timeout等待时间 Queue.get_nowait() 相当Queue.get(False) 非阻塞 Queue.put(item) 写入队列,timeout等待时间 Queue.put_nowait(item) 相当Queue.put(item, False) Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执行别的操作
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!