Python?常用模塊threading和Thread模塊之線程池
1. 池的概念
主線程:
相當(dāng)于生產(chǎn)者,只管向線程池提交任務(wù)。 并不關(guān)心線程池是如何執(zhí)行任務(wù)的。
線程池:
相當(dāng)于消費(fèi)者,負(fù)責(zé)接收任務(wù),并將任務(wù)分配到一個(gè)空閑的線程中去執(zhí)行。并不關(guān)心是哪一個(gè)線程執(zhí)行的這個(gè)任務(wù)。
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): # 創(chuàng)建線程 Thread(target=self.worker, daemon=True).start() #daemon是開(kāi)啟守護(hù)線程 # 執(zhí)行任務(wù) def worker(self): while True: func, args, kwargs = self.queue.get() func(*args, *kwargs) self.queue.task_done() # 獲取任務(wù),將任務(wù)添加到隊(duì)列中 def apply_async(self, target, args=(), kwargs={}): self.queue.put((target, args, kwargs)) # 阻塞 def join(self): self.queue.join() def fun(x): print('愛(ài)孤寒者 第%s次' % x) time.sleep(3) print('帥哥美女就關(guān)注同名微信公眾號(hào)【孤寒者】啦~') # 開(kāi)兩個(gè)線程 t = ThreadPool(2) # 提交10個(gè)任務(wù) for i in range(10): t.apply_async(fun, args=(i,)) t.join()
3. 使用Python內(nèi)置線程池
# -*- coding: utf-8 -*- from multiprocessing.pool import ThreadPool import time pool = ThreadPool(2) # 創(chuàng)建兩個(gè)線程 def funa(x, y): print('%s好好學(xué)習(xí)' % x) time.sleep(3) print('天天向上') def funb(x, y): print('%shello' % x) time.sleep(3) print('world') # 我們這就是有一個(gè)線程池,里面有兩個(gè)等待處理任務(wù)的線程,然后這兩個(gè)函數(shù)就是兩個(gè)任務(wù), # 線程池里一個(gè)線程處理一個(gè),所以會(huì)同時(shí)輸出!如果多于兩個(gè)任務(wù)就會(huì)執(zhí)行等待sleep pool.apply_async(funa, args=('我們要————', 2)) # 將任務(wù)添加到線程池 pool.apply_async(funb, args=('大家要————', 4)) pool.close() # close之后則無(wú)法向線程池提交任務(wù) # 內(nèi)置線程池,自帶守護(hù)線程,主線程結(jié)束,子線程也跟著結(jié)束 # 所以需要加阻塞,否則主線程一結(jié)束,子線程也跟著結(jié)束,無(wú)輸出 pool.join() # 在join之前可使用終止線程,直接終止線程pool: pool.terminate() print('這是程序的最后一行,執(zhí)行到這里,主線程結(jié)束')
4. 池的其他操作
操作一: close - 關(guān)閉提交通道,不允許再提交任務(wù);
操作二: terminate - 中止進(jìn)程池,中止所有任務(wù) 。
拓展: JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于人閱讀和編寫(xiě)。 是用來(lái)存儲(chǔ)和交換文本信息的語(yǔ)法。
數(shù)據(jù)在名稱(chēng)/值對(duì)中 數(shù)據(jù)由逗號(hào)分隔 大括號(hào)保存對(duì)象 中括號(hào)保存數(shù)組
使用 JSON 函數(shù)需要導(dǎo)入 json 庫(kù):import json。
json,用于字符串 和 python數(shù)據(jù)類(lèi)型間進(jìn)行轉(zhuǎn)換json模塊提供了四個(gè)功能:dumps、dump、loads、load
- 1.json.dumps 將 Python 對(duì)象編碼成 JSON 數(shù)據(jù)
- 2.json.dump 將 JSON 數(shù)據(jù)通過(guò)特殊的形式轉(zhuǎn)換為只有 Python 認(rèn)識(shí)的字符串并寫(xiě)入文件
- 3.json.loads 將已編碼的 JSON 數(shù)據(jù)解碼為 Python 對(duì)象
- 4.json.load 將一個(gè)包含 JSON 格式數(shù)據(jù)的可讀文件解碼為一個(gè) Python 對(duì)象并寫(xiě)入文件
到此這篇關(guān)于Python 常用模塊threading和Thread模塊之線程池的文章就介紹到這了,更多相關(guān)Python線程池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Python實(shí)現(xiàn)簡(jiǎn)單的驗(yàn)證碼處理
這篇文章主要介紹了利用Python實(shí)現(xiàn)簡(jiǎn)單的驗(yàn)證碼處理,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06使用Django2快速開(kāi)發(fā)Web項(xiàng)目的詳細(xì)步驟
這篇文章主要介紹了使用Django2快速開(kāi)發(fā)Web項(xiàng)目的詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01對(duì)python中兩種列表元素去重函數(shù)性能的比較方法
今天小編就為大家分享一篇對(duì)python中兩種列表元素去重函數(shù)性能的比較方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python腳本在Appium庫(kù)上對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試
這篇文章主要介紹了使用Python的Appium庫(kù)對(duì)移動(dòng)應(yīng)用實(shí)現(xiàn)自動(dòng)化測(cè)試的教程,屬于Python腳本的一個(gè)自動(dòng)化應(yīng)用,需要的朋友可以參考下2015-04-04給Python學(xué)習(xí)者的文件讀寫(xiě)指南(含基礎(chǔ)與進(jìn)階)
今天,貓貓跟大家一起,好好學(xué)習(xí)Python文件讀寫(xiě)的內(nèi)容,這部分內(nèi)容特別常用,掌握后對(duì)工作和實(shí)戰(zhàn)都大有益處,學(xué)習(xí)是循序漸進(jìn)的過(guò)程,欲速則不達(dá)2020-01-01