- 多线程与多进程概念
多进程即一个进程会产生很多子进程,每个子进程都有自己的 PID,还有自己的内存空间;多线程即一个进程里面包含很多线程,只有一个 PID,每个线程之间内存共享,因为都是在一个进程里,CPU 的一个核会处理一个线程或一个进程。比如一个播放器就是一个多线程的软件,一个线程去处理声音,一个线程去处理画面,这两个线程是同时运行的(并行),这样声音和画面才能同步播放,如果是一个单进程的,那么只能先处理声音,处理完再处理画面(串行),这样就不能同步播放了。
- 多进程模块实例: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() 阻塞主进程,等待子进程执行完
python多进程相关知识
最新推荐文章于 2025-05-27 18:33:36 发布