python3 進程池和線程池


進程池的使用實例

import time
from concurrent.futures import ProcessPoolExecutor


def func(name):
    print(f"{name}開始")
    time.sleep(0.5)
    print(f"{name}結束")


if __name__ == '__main__':
    p = ProcessPoolExecutor(max_workers=3)  # 創建一個進程池
    for i in range(1, 10):
        p.submit(func, f"進程{i}")  # 往進程池內提交任務

    p.shutdown()  # 主進程等待子進程結束
    print("主進程結束")

執行結果:

進程1開始
進程2開始
進程3開始
進程1結束
進程4開始
進程2結束
進程5開始
進程3結束
進程6開始
進程4結束
進程7開始
進程5結束
進程8開始
進程6結束
進程9開始
進程7結束
進程8結束
進程9結束
主進程結束

創建一個進程池,進程池里有3個進程同時在執行任務,哪個進程執行完了,會自動執行下一個任務,相當於原來是一個人干活,現在是3個人一起干活,速度會提高很多。

 

線程池的使用實例

import time
from concurrent.futures import ThreadPoolExecutor


def func(name):
    print(f"{name}開始")
    time.sleep(0.5)
    print(f"{name}結束")


if __name__ == '__main__':
    p = ThreadPoolExecutor(max_workers=3)  # 創建一個線程池,里面最多有3個線程同時工作
    for i in range(1, 10):
        p.submit(func, f"線程{i}")
    p.shutdown()  # 主線程等待子線程結束
    print("主線程結束")

執行結果:

線程1開始
線程2開始
線程3開始
線程3結束
線程1結束
線程2結束
線程4開始
線程5開始
線程6開始
線程5結束
線程4結束
線程6結束
線程7開始
線程8開始
線程9開始
線程7結束
線程8結束
線程9結束
主線程結束

創建一個線程池,線程池里有3個線程同時在執行任務,哪個線程執行完了,會自動執行下一個任務,相當於原來是一個人干活,現在是3個人一起干活,速度會提高很多。

 

對比看下線程池和進程池(用法完全一樣)

import os
import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import threading
import random


def f(n):
    time.sleep(random.randint(1, 3))
    # print(n)
    # print("進程(%s) %s的平方: %s" % (os.getpid(), n, n*n))
    print("線程(%s) %s的平方: %s" % (threading.current_thread().getName(), n, n * n))
    return n * n


if __name__ == '__main__':

    pool = ThreadPoolExecutor(max_workers=5)
    # pool = ProcessPoolExecutor(max_workers=5)
    ret_list = []
    for i in range(10):
        ret = pool.submit(f, i)  # 異步提交任務,f函數名稱或者方法名稱,i給f函數的參數
        # print(ret.result())  #join
        ret_list.append(ret)

    # pool.shutdown()  #鎖定線程池,不讓新任務再提交進來了.輕易不用
    for i in ret_list:
        print(i.result())

執行結果:

線程(ThreadPoolExecutor-0_2) 2的平方: 4
線程(ThreadPoolExecutor-0_3) 3的平方: 9
線程(ThreadPoolExecutor-0_1) 1的平方: 1
線程(ThreadPoolExecutor-0_0) 0的平方: 0
線程(ThreadPoolExecutor-0_2) 5的平方: 25
0
1
4
9
線程(ThreadPoolExecutor-0_4) 4的平方: 16
16
25
線程(ThreadPoolExecutor-0_3) 6的平方: 36
36
線程(ThreadPoolExecutor-0_1) 7的平方: 49
線程(ThreadPoolExecutor-0_2) 9的平方: 81
49
線程(ThreadPoolExecutor-0_0) 8的平方: 64
64
81

 

接下來再看一個實例(add_done_callback回調)

import time
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import random


def f(n):
    time.sleep(random.randint(1, 3))
    return n * n


def call_back(m):
    print(m)
    print(m.result())


if __name__ == '__main__':
    pool = ThreadPoolExecutor(max_workers=5)
    pool.submit(f, 2).add_done_callback(call_back)

執行結果:

<Future at 0x2998208 state=finished returned int>
4

 

帶有回調函數的進程池

from concurrent.futures import ProcessPoolExecutor


def func(name):
    print(name)
    return 123


def callback(res):
    print("結束了一個", res.result())


if __name__ == '__main__':
    p = ProcessPoolExecutor(3)
    for i in range(5):
        # 添加到進程池,開啟該進程,並設置回調,當func結束的時候,自動執行callback,並可以直接拿到func函數執行的返回值
        p.submit(func, f"進程{i}").add_done_callback(callback)
    print("主進程")

 執行結果:

主進程
進程0
進程1
結束了一個 123
進程2
進程3
結束了一個 123
進程4
結束了一個 123
結束了一個 123
結束了一個 123

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM