python中生产者消费者线程问题
问题描述
在使用python的多线程时,使用了生产者消费者模式,一般都是消费者接受生产者的数据执行某些操作,但是现在这个消费者线程遇到了异常,需要终止执行,但是生产者线程因为还在生产数据,主线程在等待它执行完。目前想当消费者线程遇到错误时能够通知生产者线程,我挂了,你也结束吧。请问大家有什么好的实现方法
import threadingclass Producer(threading.Thread): def __init__(self, queue):super(Producer, self).__init__()self.queue = queue def run(self):while True: for i in range(10):self.queue.put(i)class Consumer(threading.Thread): def __init__(self, queue):super(Consumer, self).__init__()self.queue = queue def run(self):while True: try:data = self.queue.get()print dataif data == 5: raise ValueError(’over’) except ValueError as e:#通知生产者结束#如何实现?
问题解答
回答1:我的方法:添加一个 flag 标识。
先看结果吧:
更多废话也不多说了,show u the code
#!/usr/bin/python# coding=utf-8import threadingimport timeclass Producer(threading.Thread): def __init__(self, queue, flag):super(Producer, self).__init__()self.queue = queueself.flag = flag def run(self):while True: length = max(self.queue) + 1 print '============================= producer queue', self.queue self.queue.append(length) print ’flag length=’, len(self.flag) if len(self.flag) == 0:print 'producer 我也结束了'break time.sleep(2)class Consumer(threading.Thread): def __init__(self, queue, flag):super(Consumer, self).__init__()self.queue = queueself.flag = flag def run(self):while True: try:length = len(self.queue)print 'consumer queue', self.queueif length > 5: self.flag.pop() # 注意我是flag raise ValueError(’over’)self.queue.pop(0) except ValueError as e:# 通知生产者结束# 如何实现?print 'consumer 我结束了', ebreak# raise(e) time.sleep(4)queue = [1, 2, 3]flag = [0] # 表示正常Consumer(queue, flag).start()time.sleep(1)Producer(queue, flag).start()
最后说说python的多线程,由于GIL的存在,其实多线程有的时候并不是最好的选择,具体什么时候使用,网上也说的很多了,楼主也可以结合自己的业务情况舍取多线程模块。
回答2:简单的话,就直接把错误raise出来,然后让进程自己崩溃掉就好了.或者,你也可以用异常处理把消费者的run包裹起来,捕获这个异常,然后再控制生产者的线程就好了.
相关文章:
1. javascript - 使用form进行页面跳转,但是很慢,如何加一个Loading?2. python 计算两个时间相差的分钟数,超过一天时计算不对3. angular.js - 输入邮箱地址之后, 如何使其自动在末尾添加分号?4. javascript - JS 里面的 delete object.key 到底删除了什么?5. angular.js - angularjs 注入模块报错 很怪异... 求解惑6. javascript - ES6规范下 repeat 函数报错 Invalid count value7. html5 - 为什么使使用vue cli 脚手架,post-css 没有自动对css3属性自动添加浏览器前缀呢?8. java如何生成token?9. javascript - 后台管理系统左侧折叠导航栏数据较多,怎么样直接通过搜索去定位到具体某一个菜单项位置,并展开当前菜单10. javascript - html5的data属性怎么指定一个function函数呢?
