python3中的多进程库multiprocessing使用

33 阅读1分钟

case1

python2多进程代码如下,

import os 
import sys 
import time 
import multiprocessing 

def worker(input):
    x, y = input 
    return x * y 

def main_v1():
    pool = multiprocessing.Pool(processes=2)
    inputs = [(1,2),(2,3),(3,4),(4,5),(5,6)]
    results = pool.map(worker, inputs)  

    pool.close()
    pool.join() 
    print("results: {}".format(results))

    return 

if __name__ == "__main__":
    start_t = time.time() 

    main_v1()

    end_t = time.time()
    print("used time: {} minutes!".format((end_t - start_t) / 60.0))

运行程序,输出如下内容,

results: [2, 6, 12, 20, 30]
used time: 0.00185183286667 minutes!

case2

对于如下代码,

import os 
import time 
import sys 

def process_one(x: int, y: int) -> None:
    """
    你要执行的一步操作,这里只是给出一个示例
    """
    res = x + y 
    return 

if __name__ == "__main__":
    start_t = time.time()

    a = [x for x in range(1000)]
    b = [x for x in range(1000,2000)]
    for i in range(len(a)):
        x = a[i]
        y = b[i]
        process_one(x, y)

    end_t = time.time()
    print(f"used time: {(end_t - start_t) / 60.0} minutes!") 

将它改造成多线程版本如下,

import os 
import time 
import sys 
from multiprocessing import Pool 

def process_one(x: int, y: int) -> None:
    """
    你要执行的一步操作,这里只是给出一个示例
    """
    res = x + y 
    return 

def process_folder(input):
    x, y = input 
    process_one(x, y) 
    return 


if __name__ == "__main__":
    start_t = time.time()

    a = [x for x in range(1000)]
    b = [x for x in range(1000,2000)]
    
    argvs = [] #整理process_one()函数的输入参数
    for i in range(len(a)):
        x = a[i]
        y = b[i]
        argvs.append((x,y))
    
    with Pool(processes=10) as pool:
        pool.map(process_folder, argvs)


    end_t = time.time()
    print(f"used time: {(end_t - start_t) / 60.0} minutes!")