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. 為什么我ping不通我的docker容器呢???2. 服務器端 - 采用nginx做web服務器,C++開發應用程序 出現拒絕連接請求?3. java - 自己制作一個視頻播放器,遇到問題,用的是內置surfaceview類,具體看代碼!4. javascript - 有什么兼容性比較好的辦法來判斷瀏覽器窗口的類型?5. javascript - vue 移動端的input 數字輸入優化6. 關于docker下的nginx壓力測試7. python - pandas按照列A和列B分組,將列C求平均數,怎樣才能生成一個列A,B,C的dataframe8. HTML5禁止img預覽該怎么解決?9. javascript - nidejs環境設置操作一直出現這種問題怎么解決?10. java - 靜態屬性中的賦值和靜態代碼塊中的賦值有什么區別?
