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

-
主線程:
相當于生産者,隻管向線程池送出任務。
并不關心線程池是如何執行任務的。
-
線程池:
相當于消費者,負責接收任務,并将任務配置設定到一個空閑的線程中去執行。并不關心是哪一個線程執行的這個任務。
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()
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('這是程式的最後一行,執行到這裡,主線程結束')