zoukankan      html  css  js  c++  java
  • python pool 进程池

    平常会经常用到多进程,可以用进程池pool来进行自动控制进程,下面介绍一下pool的简单使用。
    需要注意的是,在Windows上要想使用进程模块,就必须把有关进程的代码写if name == ‘main’ :语句的下面,才能正常使用Windows下的进程模块。Unix/Linux下则不需要。
    Pool类

    Pool类可以提供指定数量的进程供用户调用,当有新的请求提交到Pool中时,如果池还没有满,就会创建一个新的进程来执行请求。如果池满,请求就会告知先等待,直到池中有进程结束,

    才会创建新的进程来执行这些请求。
    下面介绍一下multiprocessing 模块下的Pool类下的几个方法:

    1、apply()
    函数原型:apply(func[, args=()[, kwds={}]])
    该函数用于传递不定参数,同python中的apply函数一致,主进程会被阻塞直到函数执行结束(不建议使用,并且3.x以后不在出现)。

    2、apply_async
    函数原型:apply_async(func[, args=()[, kwds={}[, callback=None]]])
    与apply用法一致,但它是非阻塞的且支持结果返回后进行回调。

    3、map()
    函数原型:map(func, iterable[, chunksize=None])
    Pool类中的map方法,与内置的map函数用法行为基本一致,它会使进程阻塞直到结果返回。
    注意:虽然第二个参数是一个迭代器,但在实际使用中,必须在整个队列都就绪后,程序才会运行子进程。

    4、map_async()
    函数原型:map_async(func, iterable[, chunksize[, callback]])
    与map用法一致,但是它是非阻塞的。其有关事项见apply_async。

    5、close()
    关闭进程池(pool),使其不在接受新的任务。

    6、terminal()
    结束工作进程,不在处理未处理的任务。

    7、join()
    主进程阻塞等待子进程的退出, join方法要在close或terminate之后使用。

    import multiprocessing
    import time
    
    
    def func(msg):
        print("msg:", msg)
        time.sleep(3)
        print("end,", msg)
    
    if __name__ == "__main__":
        # 这里设置允许同时运行的的进程数量要考虑机器cpu的数量,进程的数量最好别小于cpu的数量,
        # 因为即使大于cpu的数量,增加了任务调度的时间,效率反而不能有效提高
        pool = multiprocessing.Pool(processes = 3)
        item_list = ['processes1' ,'processes2' ,'processes3' ,'processes4' ,'processes5' ,]
        count = len(item_list)
        for item in item_list:
            msg = "hello %s" %item
            # 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去
            pool.apply_async(func, (msg,))
    
        pool.close()
        pool.join()  # 调用join之前,先调用close函数,否则会出错。执行完close后不会有新的进程加入到pool,join函数等待所有子进程结束
    

    使用多进程读取多个文件

    import pandas as pd
    import multiprocessing as mp
    
    def read_df(file_name):
        df = pd.read_csv(file_name)
        return df
    
    file_name = 'sample_%s.csv'
    month_list = [201801, 201802, 201803, 201804, 201805, 201806, 201807, 201808]
    args_list= [file_name%month for month in month_list]
    """
    如果需要传入多个参数,可以添加一个helper函数,将多个参数包装成单个参数传入,在helper函数内部将参数解开再调用目标函数
    """
    with mp.Pool(8) as pool:
        list_df = pool.map(read_df, args_list)
        df_all  = pd.concat(list_df)
        print(df_all.shape)
    
    
  • 相关阅读:
    支持国产共享软件
    Win CE 5.0 增加电池电量显示
    [转]C# 系统应用之鼠标模拟技术及自动操作鼠标
    自己写的 读写 ini 配置文件类
    自己写的 Readini 类
    sizeof与strlen()、递归优化题解
    Git学习资源收集汇总
    好用的Google Chrome插件
    【转】C# Socket编程(5)使用TCP Socket
    【转】C# Socket编程(4)初识Socket和数据流
  • 原文地址:https://www.cnblogs.com/sandy-t/p/13936247.html
Copyright © 2011-2022 走看看