• Python进程模块


    创建进程模块的方法

    os.system

    os.system是最简单创建进程的方法,参数只有一个,就是要执行的命令,如"dir",就类似于在cmd中输入的命令。

    os.exec系列函数一共有8个。查看

    os.fork

    os.fork函数调用系统API并创建子进程,但是fork函数在windows中并不存在,在linux和mac上可以正常使用。

    subprocess模块

    调用外部命令,而那些外部命令就是这些函数的参数,subprocess模块比前3种模块提供了更多的方法来调用外部命令。
    所有的方法种args是必传的参数,它可以是字符串或者序列类型。默认执行的程序应该是序列的第一个字段,单个字符串的话,解析依赖于平台。在Unix系统中,如果args是一个字符串,那么这个字符串会解释成被执行程序的名字或路径,这种情况只能用在不需要传参数的程序上。
    这里介绍下与os.system类型的函数功能:接收参数运行命令并返回命令。他就是subprocess.call函数,但他返回的是返回命令的退出码(为0则表示运行成功)
    个人觉得:运行命令参数的话,他比os.system繁琐多了。

    multiprocessing.Process

    multiprocessing创建的是子进程,所以可以有效地避免全局解释器锁和有效地利用多核CPU的性能。
    multiprocessing.Process对象和threading.Thread的使用方法大致一样。

    多进程之间的通信

    multiprocessing.Queue可以实现进程之间的通信,而多线程中其实也是有个Queue对象,这里的Queue对象的作用是线程安全。


    线程之间可以共享变量,但是进程之间不会共享变量。对然multiprocessing.Queue的方法和queue.Queue方法一摸一样,但是在创建的时候需要把Queue对象传递给进程,这样才能正确的让主进程获取子进程的数据,否则主进程的Queue内一直都是空的。

    线程池

    使用的虽然还是multiprocessing模块,但它的dummy类吧,可以进行多线程的创建,并且通过该类的dummy.pool(processes=线程池的数量),该类的作用是复制了multiprocessing模块的API,但多线程实现线程池的方法和多进程实现进程池的方法一样。线程池也可以用map()来映射函数。

    import multiprocessing.dummy # 该模块作用是复制了multiprocessing模块的API
    import time
    # 多线程实现线程池的方法和多进程实现进程池的方法一样
    
    def process_func(process_id):
        print("process id %d start" % process_id)
        time.sleep(3)
        print("process id %d end"% process_id)
    
    def main():
        #虽然参数叫processes但是实际创建的是线程
        pool = multiprocessing.dummy.Pool(processes=3)
        for i in range(10):
            # 向进程池中添加要执行的任务
            # apply_asyns这个函数的作用是什么,asyns经常在服务器中碰到这个词;写错了,报错,是async
            pool.apply_async(process_func,args=(i,))
    
        pool.close()
        pool.join()
    
    
    if __name__ == "__main__":
        main()
    
    努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。
  • 相关阅读:
    LOJ6274 数字
    test20200415 看门人 和 WC2010 重建计划
    TJOI2018 Party 和 HDU4352 XHXJ's LIS
    LOJ3228 Tree Depth
    AGC026D Histogram Coloring
    LOJ3277 星座 和 BZOJ2616 PERIODNI
    LOJ2331 某位歌姬的故事 和 CF1327F AND Segments
    AGC024F Simple Subsequence Problem
    LOJ3278 收获
    LOJ3282 治疗计划
  • 原文地址:https://www.cnblogs.com/wkhzwmr/p/15451901.html
Copyright © 2020-2023  润新知