<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
python3 queue分三類:
他們的匯入方式分別是:
from queue import Queue from queue import LifoQueue from queue import
具體方法見下面參照說明。
Queue
物件已經包含了必要的鎖,所以你可以通過它在多個執行緒間多安全地共用資料。 當使用佇列時,協調生產者和消費者的關閉問題可能會有一些麻煩。一個通用的解決方法是在佇列中放置一個特殊的值,當消費者讀到這個值的時候,終止執行。
例如:
from queue import Queue from threading import Thread # 用來表示終止的特殊物件 _sentinel = object() # A thread that produces data def producer(out_q): for i in range(10): print("生產") out_q.put(i) out_q.put(_sentinel) # A thread that consumes data def consumer(in_q): while True: data = in_q.get() if data is _sentinel: in_q.put(_sentinel) break else: print("消費", data) # Create the shared queue and launch both threads q = Queue() t1 = Thread(target=consumer, args=(q,)) t2 = Thread(target=producer, args=(q,)) t1.start() t2.start()
結果:
本例中有一個特殊的地方:消費者在讀到這個特殊值之後立即又把它放回到佇列中,將之傳遞下去。這樣,所有監聽這個佇列的消費者執行緒就可以全部關閉了。 儘管佇列是最常見的執行緒間通訊機制,但是仍然可以自己通過建立自己的資料結構並新增所需的鎖和同步機制來實現執行緒間通訊。最常見的方法是使用 Condition
變數來包裝你的資料結構。下邊這個例子演示瞭如何建立一個執行緒安全的優先順序佇列。
import heapq import threading class PriorityQueue: def __init__(self): self._queue = [] self._count = 0 self._cv = threading.Condition() def put(self, item, priority): with self._cv: heapq.heappush(self._queue, (-priority, self._count, item)) self._count += 1 self._cv.notify() def get(self): with self._cv: while len(self._queue) == 0: self._cv.wait() return heapq.heappop(self._queue)[-1]
使用佇列來進行執行緒間通訊是一個單向、不確定的過程。通常情況下,你沒有辦法知道接收資料的執行緒是什麼時候接收到的資料並開始工作的。不過佇列物件提供一些基本完成的特性,比如下邊這個例子中的task_done()
和 join()
:
from queue import Queue from threading import Thread class Producer(Thread): def __init__(self, q): super().__init__() self.count = 5 self.q = q def run(self): while self.count > 0: print("生產") if self.count == 1: self.count -= 1 self.q.put(2) else: self.count -= 1 self.q.put(1) class Consumer(Thread): def __init__(self, q): super().__init__() self.q = q def run(self): while True: print("消費") data = self.q.get() if data == 2: print("stop because data=", data) # 任務完成,從佇列中清除一個元素 self.q.task_done() break else: print("data is good,data=", data) # 任務完成,從佇列中清除一個元素 self.q.task_done() def main(): q = Queue() p = Producer(q) c = Consumer(q) p.setDaemon(True) c.setDaemon(True) p.start() c.start() # 等待佇列清空 q.join() print("queue is complete") if __name__ == '__main__': main()
結果:
設定倆佇列,一個是要做的任務佇列todo_queue
,一個是已經完成的佇列done_queue
。
每次執行執行緒,先從todo_queue
佇列裡取出一個值,然後執行完,放入done_queue
佇列。
如果todo_queue
為空,就退出。
import logging import logging.handlers import threading import queue log_mgr = None todo_queue = queue.Queue() done_queue = queue.Queue() class LogMgr: def __init__(self, logpath): self.LOG = logging.getLogger('log') loghd = logging.handlers.RotatingFileHandler(logpath, "a", 0, 1) fmt = logging.Formatter("%(asctime)s %(threadName)-10s %(message)s", "%Y-%m-%d %H:%M:%S") loghd.setFormatter(fmt) self.LOG.addHandler(loghd) self.LOG.setLevel(logging.INFO) def info(self, msg): if self.LOG is not None: self.LOG.info(msg) class Worker(threading.Thread): global log_mgr def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): while True: try: task = todo_queue.get(False) if task: log_mgr.info("HANDLE_TASK: %s" % task) done_queue.put(1) except queue.Empty: break return def main(): global log_mgr log_mgr = LogMgr("mylog") for i in range(30): todo_queue.put("data"+str(i)) workers = [] for i in range(3): w = Worker("worker"+str(i)) workers.append(w) for i in range(3): workers[i].start() for i in range(3): workers[i].join() total_num = done_queue.qsize() log_mgr.info("TOTAL_HANDLE_TASK: %d" % total_num) exit(0) if __name__ == '__main__': main()
輸出紀錄檔檔案結果:
到此這篇關於python3 queue多執行緒通訊的文章就介紹到這了,更多相關python queue多執行緒通訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45