国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python多線程和隊列操作實例

2019-11-25 17:16:38
字體:
來源:轉載
供稿:網友

Python3,開一個線程,間隔1秒把一個遞增的數字寫入隊列,再開一個線程,從隊列中取出數字并打印到終端

復制代碼 代碼如下:

#! /usr/bin/env python3

import time
import threading
import queue

# 一個線程,間隔一定的時間,把一個遞增的數字寫入隊列
# 生產者
class Producer(threading.Thread):

    def __init__(self, work_queue):
        super().__init__() # 必須調用
        self.work_queue = work_queue
       
    def run(self):
        num = 1
        while True:
            self.work_queue.put(num)
            num = num+1
            time.sleep(1) # 暫停1秒

# 一個線程,從隊列取出數字,并顯示到終端
class Printer(threading.Thread):

    def __init__(self, work_queue):
        super().__init__() # 必須調用
        self.work_queue = work_queue

    def run(self):
        while True:
            num = self.work_queue.get() # 當隊列為空時,會阻塞,直到有數據
            print(num)

def main():
    work_queue = queue.Queue()

    producer = Producer(work_queue)
    producer.daemon = True # 當主線程退出時子線程也退出
    producer.start()

    printer = Printer(work_queue)
    printer.daemon = True # 當主線程退出時子線程也退出
    printer.start()

    work_queue.join() # 主線程會停在這里,直到所有數字被get(),并且task_done(),因為沒有調用task_done(),所在這里會一直阻塞,直到用戶按^C

if __name__ == '__main__':
    main()


queue是線程安全的,從多個線程訪問時無需加鎖。
如果在work_queue.get()之后調用work_queue.task_done(),那么在隊列空時work_queue.join()會返回。
這里work_queue.put()是間隔一定時間才往隊列放東西,如果調用work_queue.task_done(),在數字1被get()后,隊列空時,join()就返回,程序就結束了。
也就是程序只打印了1然后就退出了。
所以在這種使用情景下,不能調用task_done(),程序會一直循環下去。
https://docs.python.org/3/library/queue.html

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 张家口市| 大英县| 枞阳县| 平和县| 汉源县| 广汉市| 北京市| 江源县| 禄丰县| 宁陵县| 芜湖市| 大姚县| 沁阳市| 肥东县| 永昌县| 巫溪县| 和硕县| 城市| 京山县| 广平县| 法库县| 内黄县| 宾阳县| 区。| 汉中市| 镇安县| 日喀则市| 同心县| 曲水县| 达孜县| 托里县| 安西县| 商南县| 洛宁县| 嵊泗县| 班戈县| 镇远县| 墨竹工卡县| 萍乡市| 厦门市| 师宗县|