Python 多进程编程
Python的解释器默认是线程安全的,其主要措施是一个叫做GIL(Global Interpreter Lock)的机制。
GIL机制来保证对Python对象的引用计数的操作都是原子操作,从而不会因为多线程造成引用对象的内存泄漏和错误引用。但是这个机制也就限制了多线程的性能。因为GIL的存在,Python一次只能有一个线程在运行。
所以多线程不能提高程序性能,除非你有大量的I/O操作(例如:读写文件,网络通信等)。
另外一种提高性能,利用多CPU的方案就是多进程。
这里介绍如何使用Python库multiprocessing
,生成多进程来利用多核CPU。
多进程库 multiprocessing
multiprocessing 是Python的标准库之一,官方文档参考multiprocessing — Process-based parallelism.
我们主要使用它的2个类来产生子进程:
- Process 进程类
- Pool 进程池类
进程类 Process
Process类可以单独调用,也可以继承使用。主要操作如下:
- Process.start() 启动子进程
- Process.join() 等待子进程结束(阻塞等待)
- Process.is_alive() 判断子进程是否在运行(运行中返回True)
- Process.close() 结束子进程(不推荐使用,会抛出异常)
这里以调用为例:
#!/usr/bin/python
from __future__ import print_function # at top of module
from __future__ import division, unicode_literals, with_statement
import time
import os
from multiprocessing import Process
def task_func(timeout):
name = 'task[%d]' % os.getpid()
print('%s start' % name)
for i in range(timeout):
time.sleep(1)
print('%s waiting(%d/%d)'<