最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python3?queue多線程通信

 更新時(shí)間:2022年07月12日 16:37:14   作者:lilongsy???????  
這篇文章主要介紹了python3?queue多線程通信,??Queue???對(duì)象已經(jīng)包含了必要的鎖,所以你可以通過(guò)它在多個(gè)線程間多安全地共享數(shù)據(jù),更多相關(guān)內(nèi)容需要的朋友可以參考一下下文文章內(nèi)容

queue分類(lèi)

python3 queue分三類(lèi):

  • 先進(jìn)先出隊(duì)列
  • 后進(jìn)先出的棧
  • 優(yōu)先級(jí)隊(duì)列

他們的導(dǎo)入方式分別是:

from queue import Queue
from queue import LifoQueue
from queue import

具體方法見(jiàn)下面引用說(shuō)明。

例子一、生產(chǎn)消費(fèi)模式

Queue 對(duì)象已經(jīng)包含了必要的鎖,所以你可以通過(guò)它在多個(gè)線程間多安全地共享數(shù)據(jù)。 當(dāng)使用隊(duì)列時(shí),協(xié)調(diào)生產(chǎn)者和消費(fèi)者的關(guān)閉問(wèn)題可能會(huì)有一些麻煩。一個(gè)通用的解決方法是在隊(duì)列中放置一個(gè)特殊的值,當(dāng)消費(fèi)者讀到這個(gè)值的時(shí)候,終止執(zhí)行。

例如:

from queue import Queue
from threading import Thread
# 用來(lái)表示終止的特殊對(duì)象
_sentinel = object()
# A thread that produces data
def producer(out_q):
for i in range(10):
print("生產(chǎn)")
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("消費(fèi)", 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()

結(jié)果:

本例中有一個(gè)特殊的地方:消費(fèi)者在讀到這個(gè)特殊值之后立即又把它放回到隊(duì)列中,將之傳遞下去。這樣,所有監(jiān)聽(tīng)這個(gè)隊(duì)列的消費(fèi)者線程就可以全部關(guān)閉了。 盡管隊(duì)列是最常見(jiàn)的線程間通信機(jī)制,但是仍然可以自己通過(guò)創(chuàng)建自己的數(shù)據(jù)結(jié)構(gòu)并添加所需的鎖和同步機(jī)制來(lái)實(shí)現(xiàn)線程間通信。最常見(jiàn)的方法是使用 Condition變量來(lái)包裝你的數(shù)據(jù)結(jié)構(gòu)。下邊這個(gè)例子演示了如何創(chuàng)建一個(gè)線程安全的優(yōu)先級(jí)隊(duì)列。

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

使用隊(duì)列來(lái)進(jìn)行線程間通信是一個(gè)單向、不確定的過(guò)程。通常情況下,你沒(méi)有辦法知道接收數(shù)據(jù)的線程是什么時(shí)候接收到的數(shù)據(jù)并開(kāi)始工作的。不過(guò)隊(duì)列對(duì)象提供一些基本完成的特性,比如下邊這個(gè)例子中的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("生產(chǎn)")
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("消費(fèi)")
data = self.q.get()
if data == 2:
print("stop because data=", data)
# 任務(wù)完成,從隊(duì)列中清除一個(gè)元素
self.q.task_done()
break
else:
print("data is good,data=", data)
# 任務(wù)完成,從隊(duì)列中清除一個(gè)元素
self.q.task_done()
def main():
q = Queue()
p = Producer(q)
c = Consumer(q)
p.setDaemon(True)
c.setDaemon(True)
p.start()
c.start()
# 等待隊(duì)列清空
q.join()
print("queue is complete")
if __name__ == '__main__':
main()

結(jié)果:

例子三、多線程里用queue

設(shè)置倆隊(duì)列,一個(gè)是要做的任務(wù)隊(duì)列todo_queue,一個(gè)是已經(jīng)完成的隊(duì)列done_queue。
每次執(zhí)行線程,先從todo_queue隊(duì)列里取出一個(gè)值,然后執(zhí)行完,放入done_queue隊(duì)列。
如果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()

輸出日志文件結(jié)果:

到此這篇關(guān)于python3 queue多線程通信的文章就介紹到這了,更多相關(guān)python queue多線程通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python基礎(chǔ)教程,Python入門(mén)教程(超詳細(xì))

    Python基礎(chǔ)教程,Python入門(mén)教程(超詳細(xì))

    Python由荷蘭數(shù)學(xué)和計(jì)算機(jī)科學(xué)研究學(xué)會(huì) 于1990 年代初設(shè)計(jì),作為一門(mén)叫做ABC語(yǔ)言的替代品。Python語(yǔ)法和動(dòng)態(tài)類(lèi)型,以及解釋型語(yǔ)言的本質(zhì),使它成為多數(shù)平臺(tái)上寫(xiě)腳本和快速開(kāi)發(fā)應(yīng)用的編程語(yǔ)言
    2021-06-06
  • python自動(dòng)化測(cè)試之破解圖文驗(yàn)證碼

    python自動(dòng)化測(cè)試之破解圖文驗(yàn)證碼

    這篇文章介紹了python自動(dòng)化測(cè)試之破解圖文驗(yàn)證碼的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • python3 中時(shí)間戳、時(shí)間、日期的轉(zhuǎn)換和加減操作

    python3 中時(shí)間戳、時(shí)間、日期的轉(zhuǎn)換和加減操作

    這篇文章主要介紹了python3 中時(shí)間戳、時(shí)間、日期的轉(zhuǎn)換和加減操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • 詳解在python操作數(shù)據(jù)庫(kù)中游標(biāo)的使用方法

    詳解在python操作數(shù)據(jù)庫(kù)中游標(biāo)的使用方法

    這篇文章主要介紹了在python操作數(shù)據(jù)庫(kù)中游標(biāo)的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 處理Selenium3+python3定位鼠標(biāo)懸停才顯示的元素

    處理Selenium3+python3定位鼠標(biāo)懸停才顯示的元素

    這篇文章主要介紹了Selenium3+python3--如何定位鼠標(biāo)懸停才顯示的元素 ,文中通過(guò)簡(jiǎn)單代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2019-07-07
  • opencv-python+yolov3實(shí)現(xiàn)目標(biāo)檢測(cè)

    opencv-python+yolov3實(shí)現(xiàn)目標(biāo)檢測(cè)

    因?yàn)樽罱娜蝿?wù)有用到目標(biāo)檢測(cè),快速地了解了目標(biāo)檢測(cè)這一任務(wù),并且實(shí)現(xiàn)了使用opencv進(jìn)行目標(biāo)檢測(cè)。感興趣的可以了解一下
    2021-06-06
  • Python中os模塊的使用及文件對(duì)象的讀寫(xiě)詳解

    Python中os模塊的使用及文件對(duì)象的讀寫(xiě)詳解

    這篇文章主要介紹了Python中os模塊的使用及文件對(duì)象的讀寫(xiě)詳解,Python?open()?方法用于打開(kāi)一個(gè)文件,并創(chuàng)建返回文件對(duì)象,在對(duì)文件進(jìn)行處理過(guò)程都需要使用到這個(gè)函數(shù),如果該文件無(wú)法被打開(kāi),會(huì)拋出?OSError,需要的朋友可以參考下
    2023-08-08
  • Pandas數(shù)據(jù)合并的兩種實(shí)現(xiàn)方法

    Pandas數(shù)據(jù)合并的兩種實(shí)現(xiàn)方法

    本文主要介紹了Pandas數(shù)據(jù)合并的兩種實(shí)現(xiàn)方法,DataFrame數(shù)據(jù)合并主要使用merge()方法和concat()方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Python嵌套循環(huán)的使用

    Python嵌套循環(huán)的使用

    本文主要介紹了Python嵌套循環(huán)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧<BR>
    2023-02-02
  • python 6.7 編寫(xiě)printTable()函數(shù)表格打印(完整代碼)

    python 6.7 編寫(xiě)printTable()函數(shù)表格打印(完整代碼)

    這篇文章主要介紹了python 6.7 編寫(xiě)一個(gè)名為printTable()的函數(shù) 表格打印,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

武夷山市| 中阳县| 龙南县| 正安县| 福建省| 唐河县| 溆浦县| 寿阳县| 潞城市| 都兰县| 大埔县| 绥棱县| 渝北区| 遵义县| 甘孜县| 乃东县| 桑植县| 清丰县| 淮南市| 昆山市| 连南| 兴义市| 长沙县| 余干县| 永新县| 长丰县| 牡丹江市| 宝坻区| 当雄县| 东山县| 临夏县| 马尔康县| 湖南省| 邵武市| 和田县| 辉县市| 丹东市| 五华县| 昭苏县| 日照市| 广灵县|