Python 常用模塊threading和Thread模塊之線程池

1. 池的概念

主線程:

相當於生產者,隻管向線程池提交任務。 並不關心線程池是如何執行任務的。

線程池:

相當於消費者,負責接收任務,並將任務分配到一個空閑的線程中去執行。並不關心是哪一個線程執行的這個任務。

2. 自定義線程池

# -*- coding: utf-8 -*-
from threading import Thread
from queue import Queue
import time

class ThreadPool:
    # 初始化
    def __init__(self, n):
        self.queue = Queue()
        for i in range(n):
            # 創建線程
            Thread(target=self.worker, daemon=True).start()		#daemon是開啟守護線程

    # 執行任務
    def worker(self):
        while True:
            func, args, kwargs = self.queue.get()
            func(*args, *kwargs)
            self.queue.task_done()

    # 獲取任務,將任務添加到隊列中
    def apply_async(self, target, args=(), kwargs={}):
        self.queue.put((target, args, kwargs))
    # 阻塞
    def join(self):
        self.queue.join()
def fun(x):
    print('愛孤寒者 第%s次' % x)
    time.sleep(3)
    print('帥哥美女就關註同名微信公眾號【孤寒者】啦~')

# 開兩個線程
t = ThreadPool(2)
# 提交10個任務
for i in range(10):
    t.apply_async(fun, args=(i,))
t.join()

3. 使用Python內置線程池

# -*- coding: utf-8 -*-
from multiprocessing.pool import ThreadPool
import time
pool = ThreadPool(2)  # 創建兩個線程
def funa(x, y):
    print('%s好好學習' % x)
    time.sleep(3)
    print('天天向上')
def funb(x, y):
    print('%shello' % x)
    time.sleep(3)
    print('world')

# 我們這就是有一個線程池,裡面有兩個等待處理任務的線程,然後這兩個函數就是兩個任務,
# 線程池裡一個線程處理一個,所以會同時輸出!如果多於兩個任務就會執行等待sleep

pool.apply_async(funa, args=('我們要————', 2))  # 將任務添加到線程池
pool.apply_async(funb, args=('大傢要————', 4))

pool.close()  # close之後則無法向線程池提交任務

# 內置線程池,自帶守護線程,主線程結束,子線程也跟著結束
# 所以需要加阻塞,否則主線程一結束,子線程也跟著結束,無輸出
pool.join()  # 在join之前可使用終止線程,直接終止線程pool:  pool.terminate()

print('這是程序的最後一行,執行到這裡,主線程結束')

4. 池的其他操作

操作一: close – 關閉提交通道,不允許再提交任務;

操作二: terminate – 中止進程池,中止所有任務 。

拓展: JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於人閱讀和編寫。 是用來存儲和交換文本信息的語法。

數據在名稱/值對中 數據由逗號分隔 大括號保存對象 中括號保存數組

使用 JSON 函數需要導入 json 庫:import json。

json,用於字符串 和 python數據類型間進行轉換json模塊提供瞭四個功能:dumps、dump、loads、load

  • 1.json.dumps 將 Python 對象編碼成 JSON 數據
  • 2.json.dump 將 JSON 數據通過特殊的形式轉換為隻有 Python 認識的字符串並寫入文件
  • 3.json.loads 將已編碼的 JSON 數據解碼為 Python 對象
  • 4.json.load 將一個包含 JSON 格式數據的可讀文件解碼為一個 Python 對象並寫入文件

到此這篇關於Python 常用模塊threading和Thread模塊之線程池的文章就介紹到這瞭,更多相關Python線程池內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: