python中的multiprocessing是一个多进程管理包,主要作用也就是提供多进程,而不是多线程,在其中用的比较多估计也就是Process和Pipe两个类,如下代码所示:
#!/usr/bin/env python from multiprocessing import Process,Pipe def fun(pipe,x): pipe.send('hello,'+x) reciver,sender = Pipe() proc = Process(target=fun,args=(sender,'kel',)) #传递参数为sender,其实传递的是reciver也是可以的 proc.start() print reciver.recv() proc.join() print reciver.recv() #在等待接收在创建Pipe()对象的时候,可以使用两个部分,一个是用来接收的,一个是用来发送的,如上的构造对象中,两者均可以用来发送和接收。
执行结果如下:
[root@python 55]# python simplePipe.py hello,kel发送的时候,发送的消息为kel然后返回值为hello,kel
创建Pipe的时候,返回的是一对对象,如下所示:
>>> from multiprocessing import Pipe >>> p=Pipe() >>> p (<read-write Connection, handle 6>, <read-write Connection, handle 7>)返回的都是可读可写的。
在multiprocessing的多进程管理中,主要是用Process来创建进程,从而来创建多进程的环境,也就是上面的例子代码Process
使用start方法来开启进程,使用join方法来结束进程
Process的语法结果如下:
class multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={})一般需要指定的参数为target,表示为一个函数,这个函数必须是可调用的,args表示为target的参数,是一个元组的格式。注意在只有一个参数的时候,必须写上逗号,表示为一个tuple
>>> from multiprocessing import Process >>> import time >>> def kel(): ... time.sleep(20) ... >>> proc=Process(target=kel,args=()) >>> proc.pid #进程未开始的时候,pid为None >>> proc.is_alive() #查看进程是否活动 False >>> proc.start() #进程开始运行 >>> proc.pid 6117 >>> proc.is_alive() True >>> proc.is_alive() #程序执行完毕,进程自动关闭 False >>> proc.join()
[root@python ~]# ps -ef|grep 6117 root 6117 6114 0 09:36 pts/1 00:00:00 python root 6121 6091 0 09:36 pts/3 00:00:00 grep 6117
Pipe的语法如下:
multiprocessing.Pipe([duplex])
Pipe和Process配合,可以开启一个进程,然后读取函数执行的返回信息
当需要有多个进程的时候,可以使用如下的方式:
from multiprocessing import Pipe,Process class Pool(object): @classmethod def spawn(cls,f): def fun(pipe,x): pipe.send(f(x)) pipe.close() return fun @classmethod def partmap(cls,f,X): pipe = [Pipe() for x in X] proc = [Process(target=cls.spawn(f),args=(c,x)) for x,(p,c) in zip(X,pipe)] [p.start() for p in proc] [p.join() for p in proc] return [p.recv() for p,m in pipe] def kel(x): return 'hello,',x print Pool.partmap(kel,['kel','smile'])
执行结果如下:
[('hello,', 'kel'), ('hello,', 'smile')]主要是开启多个进程来执行相关的函数,在其中使用了闭包,主要就是执行这个函数,并且通过pipe来传递相关的消息