天天看點

Python常用子產品 之threading和Thread子產品 第三階段 線程池

目錄:

  • ​​每篇前言:​​
  • ​​1. 線程池​​
  • ​​1.1 池的概念:​​
  • ​​1.2 自定義線程池:​​
  • ​​1.3 使用Python内置線程池:​​
  • ​​1.4 池的其他操作:​​

每篇前言:

🏆🏆作者介紹:【孤寒者】—全棧領域優質創作者、HDZ核心組成員、華為雲享專家Python全棧領域部落客、原力計劃作者
  • 🔥🔥本文已收錄于Python全棧系列專欄:​​《Python全棧基礎教程》​​
  • 🔥🔥熱門專欄推薦:​​《Django架構從入門到實戰》、​​​​《爬蟲從入門到精通系列教程》、​​​​《爬蟲進階》、​​​​《前端系列教程》、​​​​《tornado一條龍+一個完整版項目》。​​
  • 📝​📝本專欄面向廣大程式猿,為的是大家都做到Python從入門到精通,同時穿插有很多很多習題,鞏固學習。
  • 🚀🚀加入我一起學習進步,一個人可以走的很快,一群人才能走的更遠!

1. 線程池

1.1 池的概念:

Python常用子產品 之threading和Thread子產品 第三階段 線程池
  • 主線程:

    相當于生産者,隻管向線程池送出任務。

    并不關心線程池是如何執行任務的。

  • 線程池:

    相當于消費者,負責接收任務,并将任務配置設定到一個空閑的線程中去執行。并不關心是哪一個線程執行的這個任務。

1.2 自定義線程池:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
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()      
Python常用子產品 之threading和Thread子產品 第三階段 線程池

1.3 使用Python内置線程池:

# -*- coding: utf-8 -*-
"""
__author__ = 孤寒者
"""
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('這是程式的最後一行,執行到這裡,主線程結束')      
Python常用子產品 之threading和Thread子產品 第三階段 線程池

1.4 池的其他操作: