關於python中的多進程模塊multiprocessing

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來傳遞相關的消息





發佈了213 篇原創文章 · 獲贊 78 · 訪問量 76萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章