python多进程相关知识

本文详细介绍了多线程与多进程的概念及其在Python中的应用。解释了多进程通过生成多个子进程来并行处理任务,而多线程则是在单一进程中利用多个线程实现并行。此外还对比了threading与multiprocessing模块,并提供了多进程模块的使用实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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 multiprocessing
    
    def fun():
        print 'Hello World'
    
    for i in xrange(10):
        m = multiprocessing.Process(target=fun, args=())
        m.start()
    以多进程的方式输出声音和画面:
    #!/usr/bin/env python
    #encoding:utf8
    
    import time
    import multiprocessing
    
    def 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:utf8
    
    import time
    import multiprocessing
    
    def 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,而是 func
    pool.apply_async(func=fun, args=('画面', 3))
    pool.close()
    pool.join()    # 注意 pool.close() 之后要运行 pool.join() 阻塞主进程,等待子进程执行完



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值