python多进程相关知识

来源:互联网 发布:win7 64系统优化 编辑:程序博客网 时间:2024/06/03 05:45
  1. 多线程与多进程概念
    多进程即一个进程会产生很多子进程,每个子进程都有自己的 PID,还有自己的内存空间;多线程即一个进程里面包含很多线程,只有一个 PID,每个线程之间内存共享,因为都是在一个进程里,CPU 的一个核会处理一个线程或一个进程。比如一个播放器就是一个多线程的软件,一个线程去处理声音,一个线程去处理画面,这两个线程是同时运行的(并行),这样声音和画面才能同步播放,如果是一个单进程的,那么只能先处理声音,处理完再处理画面(串行),这样就不能同步播放了。
  2. 多进程模块实例:multiprocessing
    threading 模块虽然是一个多线程模块,但不论开多少个线程都只能用一个 CPU 来处理,所以严格意义上来讲不能算是多线程
    multiprocessing 模块是一个多进程模块,一个 CPU 处理一个进程,因此我们在写程序的时候尽量使用 multiprocessing 而不是 threading
    multiprocessing.cpu_count() :用于统计当前计算机的 CPU 个数
    multiprocessing.active_children() :用于列出当前存在的子进程
    m = multiprocessing.Process(target=fun, args=()) :用于生成一个进程的执行的对象,接收一个函数和该函数的参数,表示用进程来执行该函数
    m.start() :用来开启进程
    m.name :用来查看开启的进程的进程名
    m.pid :用来查看开启的进程的进程ID
    m.is_alive() :用来查看开启的进程是否还在运行
    m.run() :用来重写进程
    m.join() :用来阻塞进程
    lock = multiprocessing.Lock() :生成一个锁对象,锁对象有如下方法
    lock.acquire() :获取锁
    lock.release() :释放锁
    pool = multiprocessing.Pool(processes=n) :使用进程池,括号里面可以指定在进程池中同时开多少个子进程,如 multiprocessing.Pool(processes=2) 表示同时开两个子进程,如果不指定则使用 CPU 的最大核数(比如 CPU 是八核就同时开八个子进程),当有新的请求提交到进程池时,如果池还没有满,那么就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来处理该请求,进程池可以同时处理几百或上千个并行操作,进程池有如下方法
    pool.apply_async(func=fun, args=()) :向进程池提交目标请求,接收一个函数和该函数的参数
    pool.close() :关闭进程池,会等待进程池中的进程执行完再关闭
    pool.terminate() :关闭进程池,直接关闭,不会等待进程池中的进程执行完
    pool.join() :阻塞主进程,会等待进程池中的进程执行完毕才阻塞主进程
    以多进程的方式打印十个 Hello World :
    #!/usr/bin/env python#-*- coding:utf8 -*-import multiprocessingdef fun():    print 'Hello World'for i in xrange(10):    m = multiprocessing.Process(target=fun, args=())    m.start()
    以多进程的方式输出声音和画面:
    #!/usr/bin/env python#encoding:utf8import timeimport multiprocessingdef fun(name, i):    for n in xrange(i):        print name, n        time.sleep(1)m1 = multiprocessing.Process(target=fun, args=('声音', 3))m2 = multiprocessing.Process(target=fun, args=('画面', 3))m1.start()m2.start()
    以进程池的方式输出声音和画面:
    #!/usr/bin/env python#encoding:utf8import timeimport multiprocessingdef fun(name, i):    for n in xrange(i):        print name, n        time.sleep(1)pool = multiprocessing.Pool(processes=2)pool.apply_async(func=fun, args=('声音', 3))    # 注意这里不是写成 target,而是 funcpool.apply_async(func=fun, args=('画面', 3))pool.close()pool.join()    # 注意 pool.close() 之后要运行 pool.join() 阻塞主进程,等待子进程执行完



原创粉丝点击