在python中,multiprocessing模块是用来管理多进程的。multiprocessing使用和threading包类似的api接口来产生多进程,multiprocessing包提供本地和远程的并发,通过使用subprocess代替threads有效的避开了GIL,由于这一点,multiprocessing模块允许程序充分的利用多处理器。
在multiprocessing包中,通过Process对象,然后调用该对象的start()方法来创建进程。multiprocessing模块支持两种类型的进程间通讯,一种是Queues,一种是Pipes。
Queues类就像Queue.Queue的克隆,Pipe函数则返回一对连接对象,它的返回对象默认是双向的。Pipe()返回的两个连接对象代表了两个pipe,每个连接对象都有send()和recv()方法,注意,如果多个进程同时从一个pipe中读取或者写入数据,会导致pipe中的数据混乱。multiprocessing包含了和threading相同的同步原语,例如,可以通过锁来确保只有一个进程在标准输出打印。multiprocessing提供了两种办法来实现进程共享。一种是Shared memory,一种是Server process。Pool类则提供了一个进程池。
class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})
Process对象代表它运行在一个独立的进程中,Process类有着和threading.Thread相同的方法,group总是None,它的存在是和threading.Thread保持一致,target是一个调用对象,该方法可以被run()方法唤醒,name表示进程名,args是target的元组类型的参数,kwargs是target的字典类型的参数。
Process实例的方法如下:
run()
start() 启动一个进程,在一个Process对象中,必须被调用至少一次,它为run()做准备
join([timeout]) 阻碍线程调用直到进程的join()方法被调用,如果timeout是Nnoe,则没有timeout
name 进程名称,name是一个字符串,多进程则会返回相同的名称
is_alive() 返回进程是否存活
daemon 进程的daemon标记,必须在start()方法之前调用。
除过以上外,Process对象还支持以下方法和属性:
pid 返回进程id,在进程未创建前是None
exitcode 子进程退出码,如果进程还未终止,则返回None
authkey 进程的验证秘钥
terminate() 终止进程,在unix中使用SIGTERM信号
multiprocessing.Pipe([duplex])
返回一对(conn1, conn2)对象,默认duplex是True,表示返回的是双向的,表示conn1,conn2都能发送,接收消息。如果是False,则返回的是单向的,表示从conn1只能recv消息,conn2只能send消息。
class multiprocessing.Queue([maxsize])
返回一个共享队列,对象有以下方法:
qsize() 返回近似的队列大小,该值不可信,因为multithreading/multiprocessing是语义上的
empty() 如果队列是空,返回True
full() 如果队列满了,则返回True
put(obj[, block[, timeout]]) 给队列中放入一个obj,
put_nowait(obj) 相当于put(obj, False)
get([block[, timeout]]) 删除并返回队列中的元素,
get_nowait() 相当于get(False)
multiprocessing.queues.SimpleQueue
返回一个简单的队列类型。只有empty()、get()、put()三种方法
class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])
process pool对象控制pool中的哪个工作进程可以被提交,它支持异步结果,processes参数设置有多少工作进程可以被使用,如果为None,则数目为cpu_count()。如果initializer为None,则每一个进程在启动时都会调用initializer(*initargs)。maxtasksperchild表示进程在处理完多少哥任务后可以退出,并用新的工作进程代替,这样可以确保没用的资源被释放,默认为None。
有以下方法:
apply(func[, args[, kwds]]) 等同于内建的apply(),它会阻塞直到结果完成,所以在并行处理上apply_async会跟好一些。
apply_async(func[, args[, kwds[, callback]]]) 不同与apply(),它返回一个结果对象,
map(func, iterable[, chunksize]) 类似与内建map(),它会阻塞直到结果完成
map_async(func, iterable[, chunksize[, callback]]) 不同与map(),它返回一个结果对象
imap(func, iterable[, chunksize])
imap_unordered(func, iterable[, chunksize])
close() 阻止向进程池中提交任务,一旦所有的任务完成,工作进程则会退出
terminate() 立即停止工作进程,不等待工作进程完成。
join() 等待工作进程退出,在使用join()之前必须调用close()或者terminate()
multiprocessing.active_children()
返回当前进程的所有存活子进程
multiprocessing.cpu_count()
返回系统的cpu数