小編給大家分享一下python中線程池的使用方法,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!
成都創(chuàng)新互聯(lián)公司專(zhuān)注于江陰企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城開(kāi)發(fā)。江陰網(wǎng)站建設(shè)公司,為江陰等地區(qū)提供建站服務(wù)。全流程按需定制網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
如果使用線程池/進(jìn)程池來(lái)管理并發(fā)編程,那么只要將相應(yīng)的 task 函數(shù)提交給線程池/進(jìn)程池,剩下的事情就由線程池/進(jìn)程池來(lái)搞定。
Exectuor 提供了如下常用方法:
submit(fn, *args, **kwargs):將 fn 函數(shù)提交給線程池。*args 代表傳給 fn 函數(shù)的參數(shù),*kwargs 代表以關(guān)鍵字參數(shù)的形式為 fn 函數(shù)傳入?yún)?shù)。
map(func, *iterables, timeout=None, chunksize=1):該函數(shù)類(lèi)似于全局函數(shù) map(func, *iterables),只是該函數(shù)將會(huì)啟動(dòng)多個(gè)線程,以異步方式立即對(duì) iterables 執(zhí)行 map 處理。
shutdown(wait=True):關(guān)閉線程池。
程序?qū)?task 函數(shù)提交(submit)給線程池后,submit 方法會(huì)返回一個(gè) Future 對(duì)象,F(xiàn)uture 類(lèi)主要用于獲取線程任務(wù)函數(shù)的返回值。由于線程任務(wù)會(huì)在新線程中以異步方式執(zhí)行,因此,線程執(zhí)行的函數(shù)相當(dāng)于一個(gè)“將來(lái)完成”的任務(wù),所以 Python 使用 Future 來(lái)代表。
實(shí)際上,在 Java 的多線程編程中同樣有 Future,此處的 Future 與 Java 的 Future 大同小異。
Future 提供了如下方法:
cancel():取消該 Future 代表的線程任務(wù)。如果該任務(wù)正在執(zhí)行,不可取消,則該方法返回 False;否則,程序會(huì)取消該任務(wù),并返回 True。
cancelled():返回 Future 代表的線程任務(wù)是否被成功取消。
running():如果該 Future 代表的線程任務(wù)正在執(zhí)行、不可被取消,該方法返回 True。
done():如果該 Funture 代表的線程任務(wù)被成功取消或執(zhí)行完成,則該方法返回 True。
result(timeout=None):獲取該 Future 代表的線程任務(wù)最后返回的結(jié)果。如果 Future 代表的線程任務(wù)還未完成,該方法將會(huì)阻塞當(dāng)前線程,其中 timeout 參數(shù)指定最多阻塞多少秒。
exception(timeout=None):獲取該 Future 代表的線程任務(wù)所引發(fā)的異常。如果該任務(wù)成功完成,沒(méi)有異常,則該方法返回 None。
add_done_callback(fn):為該 Future 代表的線程任務(wù)注冊(cè)一個(gè)“回調(diào)函數(shù)”,當(dāng)該任務(wù)成功完成時(shí),程序會(huì)自動(dòng)觸發(fā)該 fn 函數(shù)。
調(diào)用 ThreadPoolExecutor 類(lèi)的構(gòu)造器創(chuàng)建一個(gè)線程池。
定義一個(gè)普通函數(shù)作為線程任務(wù)。
調(diào)用 ThreadPoolExecutor 對(duì)象的 submit() 方法來(lái)提交線程任務(wù)。
當(dāng)不想提交任何任務(wù)時(shí),調(diào)用 ThreadPoolExecutor 對(duì)象的 shutdown() 方法來(lái)關(guān)閉線程池。
from concurrent.futures import ThreadPoolExecutor import threading import time # 定義一個(gè)準(zhǔn)備作為線程任務(wù)的函數(shù) def action(max): my_sum = 0 for i in range(max): print(threading.current_thread().name + ' ' + str(i)) my_sum += i return my_sum # 創(chuàng)建一個(gè)包含2條線程的線程池 pool = ThreadPoolExecutor(max_workers=2) # 向線程池提交一個(gè)task, 50會(huì)作為action()函數(shù)的參數(shù) future1 = pool.submit(action, 50) # 向線程池再提交一個(gè)task, 100會(huì)作為action()函數(shù)的參數(shù) future2 = pool.submit(action, 100) # 判斷future1代表的任務(wù)是否結(jié)束 print(future1.done()) time.sleep(3) # 判斷future2代表的任務(wù)是否結(jié)束 print(future2.done()) # 查看future1代表的任務(wù)返回的結(jié)果 print(future1.result()) # 查看future2代表的任務(wù)返回的結(jié)果 print(future2.result()) # 關(guān)閉線程池 pool.shutdown()
from concurrent.futures import ThreadPoolExecutor import threading import time # 定義一個(gè)準(zhǔn)備作為線程任務(wù)的函數(shù) def action(max): my_sum = 0 for i in range(max): print(threading.current_thread().name + ' ' + str(i)) my_sum += i return my_sum # 創(chuàng)建一個(gè)包含2條線程的線程池 pool = ThreadPoolExecutor(max_workers=2) # 向線程池提交一個(gè)task, 50會(huì)作為action()函數(shù)的參數(shù) future1 = pool.submit(action, 50) # 向線程池再提交一個(gè)task, 100會(huì)作為action()函數(shù)的參數(shù) future2 = pool.submit(action, 100) # 判斷future1代表的任務(wù)是否結(jié)束 print(future1.done()) time.sleep(3) # 判斷future2代表的任務(wù)是否結(jié)束 print(future2.done()) # 查看future1代表的任務(wù)返回的結(jié)果 print(future1.result()) # 查看future2代表的任務(wù)返回的結(jié)果 print(future2.result()) # 關(guān)閉線程池 pool.shutdown()
讀者可以自己運(yùn)行此代碼查看運(yùn)行結(jié)果,這里不再演示。
當(dāng)程序使用 Future 的 result() 方法來(lái)獲取結(jié)果時(shí),該方法會(huì)阻塞當(dāng)前線程,如果沒(méi)有指定 timeout 參數(shù),當(dāng)前線程將一直處于阻塞狀態(tài),直到 Future 代表的任務(wù)返回。from concurrent.futures import ThreadPoolExecutor import threading import time # 定義一個(gè)準(zhǔn)備作為線程任務(wù)的函數(shù) def action(max): my_sum = 0 for i in range(max): print(threading.current_thread().name + ' ' + str(i)) my_sum += i return my_sum # 創(chuàng)建一個(gè)包含2條線程的線程池 with ThreadPoolExecutor(max_workers=2) as pool: # 向線程池提交一個(gè)task, 50會(huì)作為action()函數(shù)的參數(shù) future1 = pool.submit(action, 50) # 向線程池再提交一個(gè)task, 100會(huì)作為action()函數(shù)的參數(shù) future2 = pool.submit(action, 100) def get_result(future): print(future.result()) # 為future1添加線程完成的回調(diào)函數(shù) future1.add_done_callback(get_result) # 為future2添加線程完成的回調(diào)函數(shù) future2.add_done_callback(get_result) print('--------------')
from concurrent.futures import ThreadPoolExecutor import threading import time # 定義一個(gè)準(zhǔn)備作為線程任務(wù)的函數(shù) def action(max): my_sum = 0 for i in range(max): print(threading.current_thread().name + ' ' + str(i)) my_sum += i return my_sum # 創(chuàng)建一個(gè)包含2條線程的線程池 with ThreadPoolExecutor(max_workers=2) as pool: # 向線程池提交一個(gè)task, 50會(huì)作為action()函數(shù)的參數(shù) future1 = pool.submit(action, 50) # 向線程池再提交一個(gè)task, 100會(huì)作為action()函數(shù)的參數(shù) future2 = pool.submit(action, 100) def get_result(future): print(future.result()) # 為future1添加線程完成的回調(diào)函數(shù) future1.add_done_callback(get_result) # 為future2添加線程完成的回調(diào)函數(shù) future2.add_done_callback(get_result) print('--------------')
map(func, *iterables, timeout=None, chunksize=1)
方法,該方法的功能類(lèi)似于全局函數(shù) map(),區(qū)別在于線程池的 map() 方法會(huì)為 iterables 的每個(gè)元素啟動(dòng)一個(gè)線程,以并發(fā)方式來(lái)執(zhí)行 func 函數(shù)。這種方式相當(dāng)于啟動(dòng) len(iterables) 個(gè)線程,井收集每個(gè)線程的執(zhí)行結(jié)果。from concurrent.futures import ThreadPoolExecutor import threading import time # 定義一個(gè)準(zhǔn)備作為線程任務(wù)的函數(shù) def action(max): my_sum = 0 for i in range(max): print(threading.current_thread().name + ' ' + str(i)) my_sum += i return my_sum # 創(chuàng)建一個(gè)包含4條線程的線程池 with ThreadPoolExecutor(max_workers=4) as pool: # 使用線程執(zhí)行map計(jì)算 # 后面元組有3個(gè)元素,因此程序啟動(dòng)3條線程來(lái)執(zhí)行action函數(shù) results = pool.map(action, (50, 100, 150)) print('--------------') for r in results: print(r)
上面程序使用 map() 方法來(lái)啟動(dòng) 3 個(gè)線程(該程序的線程池包含 4 個(gè)線程,如果繼續(xù)使用只包含兩個(gè)線程的線程池,此時(shí)將有一個(gè)任務(wù)處于等待狀態(tài),必須等其中一個(gè)任務(wù)完成,線程空閑出來(lái)才會(huì)獲得執(zhí)行的機(jī)會(huì)),map() 方法的返回值將會(huì)收集每個(gè)線程任務(wù)的返回結(jié)果。
看完了這篇文章,相信你對(duì)python中線程池的使用方法有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!