python 繼承線程的類 不能通過標志位結束線程
問題描述
在測試生產消費者模型的時候遇到這樣一個問題,在繼承線程后 加了個標志位 mark
class Consumer(threading.Thread): def __init__(self, queue):threading.Thread.__init__(self)self._queue = queueself.mark = True def run(self):while self.mark: msg = self._queue.get() if isinstance(msg, str) and msg == ’quit’:break print('I’m a thread, and I received %s!!' % msg)print(’Bye byes!’)
def producer(): q = queue.Queue() worker = Consumer(q) worker.start() # 開啟消費者線程 start_time = time.time() while time.time() - start_time < 5:q.put(’something at %s’ % time.time())time.sleep(1) worker.mark = Flese worker.join()
我原先指望 通過這個標志位來實現線程的結束控制,但實際效果是程序卡死在worker.join()完全沒有退出。
請教下,這是什么原因?
問題解答
回答1:class Consumer(threading.Thread): def __init__(self, queue):threading.Thread.__init__(self)self._queue = queueself.mark = True def run(self):while self.mark: try:msg = self._queue.get(block=False) # 非阻塞print('I’m a thread, and I received %s!!' % msg) except:pass print(’self.mark’,self.mark)print(’Bye byes!’)def producer(): q = queue.Queue() worker = Consumer(q) worker.start() # 開啟消費者線程 start_time = time.time() while time.time() - start_time < 5:q.put(’something at %s’ % time.time())time.sleep(1) worker.mark = False worker.join()
相關文章:
1. 關docker hub上有些鏡像的tag被標記““This image has vulnerabilities””2. docker鏡像push報錯3. Docker for Mac 創建的dnsmasq容器連不上/不工作的問題4. 利用IPMI遠程安裝centos報錯!5. node.js - mongodb查找子對象的名稱為某個值的對象的方法6. html5和Flash對抗是什么情況?7. docker 下面創建的IMAGE 他們的 ID 一樣?這個是怎么回事????8. phpstudy8.1沒集成mysql-front9. javascript - 在 model里定義的 引用表模型時,model為undefined。10. 運行python程序時出現“應用程序發生異常”的內存錯誤?

網公網安備