Python实现的生产者、消费者问题完整实例
本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:
生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池(列表),生产者往里面放东西,消费者从里面取,规则是:列表为空的时候,生产者才能放东西;列表不为空的时候,消费者才能取东西;为了简单起见,暂定缓冲池中最多只能有一个产品。这里生产者和消费者共同操作一个资源:缓冲池,因此每次操作的时候,需要给资源加锁,操作结束时,释放锁,这样才能做到资源同步。使用python实现,需要继承Thread类,获取锁对象,代码如下:
#-*-coding:utf-8-*- #!python2 fromthreadingimportThread fromthreadingimportLock importtime,random pro_list=[] lock=Lock() classProducer(Thread): defrun(self): globalpro_list whileTrue: i=random.randint(0,100) lock.acquire() iflen(pro_list)>0: print"!--productstillinlist,waitconsumertogetit.." else: pro_list.append(i) print":::Producerput:",pro_list[0] lock.release() time.sleep(2) classConsumer(Thread): defrun(self): globalpro_list whileTrue: lock.acquire() iflen(pro_list)==0: print"!--Noproductnow,waitproducerputin..." else: print":::Consumerfetch:",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()
这里使用多个生产者和消费者,共同操作缓冲池,部分执行结果如下:
:::Producerput:78
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:78
:::Producerput:99
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:99
!--Noproductnow,waitproducerputin...
:::Producerput:12
:::Consumerfetch:12
:::Producerput:91
!--productstillinlist,waitconsumertogetit..
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:91
!--Noproductnow,waitproducerputin...
:::Producerput:63
:::Consumerfetch:63
:::Producerput:85
!--productstillinlist,waitconsumertogetit..
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:85
!--Noproductnow,waitproducerputin...
:::Producerput:1
:::Consumerfetch:1
:::Producerput:26
!--productstillinlist,waitconsumertogetit..
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:26
!--Noproductnow,waitproducerputin...
:::Producerput:8
:::Consumerfetch:8
:::Producerput:19
!--productstillinlist,waitconsumertogetit..
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:19
!--Noproductnow,waitproducerputin...
:::Producerput:74
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:74
:::Producerput:50
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:50
!--Noproductnow,waitproducerputin...
:::Producerput:97
:::Consumerfetch:97
:::Producerput:69
!--productstillinlist,waitconsumertogetit..
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:69
!--Noproductnow,waitproducerputin...
:::Producerput:41
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:41
:::Producerput:6
!--productstillinlist,waitconsumertogetit..
:::Consumerfetch:6
!--Noproductnow,waitproducerputin...
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python数学运算技巧总结》
希望本文所述对大家Python程序设计有所帮助。