Python3,開一個(gè)線程,間隔1秒把一個(gè)遞增的數(shù)字寫入隊(duì)列,再開一個(gè)線程,從隊(duì)列中取出數(shù)字并打印到終端
#! /usr/bin/env python3
import time
import threading
import queue
# 一個(gè)線程,間隔一定的時(shí)間,把一個(gè)遞增的數(shù)字寫入隊(duì)列
# 生產(chǎn)者
class Producer(threading.Thread):
??? def __init__(self, work_queue):
??????? super().__init__() # 必須調(diào)用
??????? self.work_queue = work_queue
???????
??? def run(self):
??????? num = 1
??????? while True:
??????????? self.work_queue.put(num)
??????????? num = num+1
??????????? time.sleep(1) # 暫停1秒
# 一個(gè)線程,從隊(duì)列取出數(shù)字,并顯示到終端
class Printer(threading.Thread):
??? def __init__(self, work_queue):
??????? super().__init__() # 必須調(diào)用
??????? self.work_queue = work_queue
??? def run(self):
??????? while True:
??????????? num = self.work_queue.get() # 當(dāng)隊(duì)列為空時(shí),會(huì)阻塞,直到有數(shù)據(jù)
??????????? print(num)
def main():
??? work_queue = queue.Queue()
??? producer = Producer(work_queue)
??? producer.daemon = True # 當(dāng)主線程退出時(shí)子線程也退出
??? producer.start()
??? printer = Printer(work_queue)
??? printer.daemon = True # 當(dāng)主線程退出時(shí)子線程也退出
??? printer.start()
??? work_queue.join() # 主線程會(huì)停在這里,直到所有數(shù)字被get(),并且task_done(),因?yàn)闆]有調(diào)用task_done(),所在這里會(huì)一直阻塞,直到用戶按^C
if __name__ == '__main__':
??? main()
queue是線程安全的,從多個(gè)線程訪問(wèn)時(shí)無(wú)需加鎖。
如果在work_queue.get()之后調(diào)用work_queue.task_done(),那么在隊(duì)列空時(shí)work_queue.join()會(huì)返回。
這里work_queue.put()是間隔一定時(shí)間才往隊(duì)列放東西,如果調(diào)用work_queue.task_done(),在數(shù)字1被get()后,隊(duì)列空時(shí),join()就返回,程序就結(jié)束了。
也就是程序只打印了1然后就退出了。
所以在這種使用情景下,不能調(diào)用task_done(),程序會(huì)一直循環(huán)下去。
https://docs.python.org/3/library/queue.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
