multiprocess-Process-Pool-Queue-2017-6-8

<div id="table-of-contents">
<h2>Table of Contents</h2>
<div id="text-table-of-contents">
<ul>
<li><a href="#org3e98343">1. .os.fork() 子進程接受返回值 0,父進程接受返回值是子進程的 pid</a></li>
<li><a href="#orge45d9ce">2. 多進程每個變量各擁有一份,互不影響</a></li>
<li><a href="#orgcca67d6">3. 多次 fork()</a></li>
<li><a href="#orge18a284">4. multiprocessing 模塊</a></li>
<li><a href="#orgb98fd3a">5. Process 子類</a></li>
<li><a href="#org2c79c73">6. 進程池 Pool</a></li>
<li><a href="#org795128d">7. Queue 的表現(xiàn)</a></li>
</ul>
</div>
</div>

<a id="org3e98343"></a>

.os.fork() 子進程接受返回值 0,父進程接受返回值是子進程的 pid

import os
rpid = os.fork()
if rpid<0:
    print("failed to fork")
elif rpid==0:
    print("I am the son process (%s),my parent process is (%s)"%(os.getpid(),os.getpid()))
else:
    print("i am parent process (%s),my son process is (%s)"%(os.getpid(),rpid))
print("will be run by son and parent")

In [4]: %run test5.py
i am parent process (24829),my son process is (25083)
will be run by son and parent
I am the son process (25083),my parent process is (25083)
will be run by son and parent
這種情況在 ipython 下創(chuàng)建了兩個進程搶輸入,沒救

<a id="orge45d9ce"></a>

多進程每個變量各擁有一份胖眷,互不影響

import os
rpid = os.fork()

n1=5
if rpid<0:
    print("failed to fork")
elif rpid==0:
    g,n=1,2
    print("I am the son process (%s),my parent process is (%s)"%(os.getpid(),os.getpid()))
    print(locals())
    print(globals())
    n1=6
    print(locals())
    print(globals())
else:
    g,n=3,6
    time.sleep(4)
    print("father sleep 4s,let son pass first!")
    print("i am parent process (%s),my son process is (%s)"%(os.getpid(),rpid))
    print(locals())
    print(globals())
print("will be run by son and parent")

---------------------------------------------------–—結果
I am the son process (25938),my parent process is (25938)
I am the son process (25938),my parent process is (25938)
{'g': 1, 'builtins': <module 'builtin' (built-in)>, 'file': 'test5.py', 'package': None, 'rpid': 0, 'n1': 5, 'time': <module 'time' (built-in)>, 'name': $
{'g': 1, 'builtins': <module 'builtin' (built-in)>, 'file': 'test5.py', 'package': None, 'rpid': 0, 'n1': 5, 'time': <module 'time' (built-in)>, 'name': $
{'g': 1, 'builtins': <module 'builtin' (built-in)>, 'file': 'test5.py', 'package': None, 'rpid': 0, 'n1': 6, 'time': <module 'time' (built-in)>, 'name': $
{'g': 1, 'builtins': <module 'builtin' (built-in)>, 'file': 'test5.py', 'package': None, 'rpid': 0, 'n1': 6, 'time': <module 'time' (built-in)>, 'name': $
will be run by son and parent
father sleep 4s,let son pass first!
i am parent process (25937),my son process is (25938)
{'g': 3, 'builtins': <module 'builtin' (built-in)>, 'file': 'test5.py', 'package': None, 'rpid': 25938, 'n1': 5, 'time': <module 'time' (built-in)>, '_name$
{'g': 3, 'builtins': <module 'builtin' (built-in)>, 'file': 'test5.py', 'package': None, 'rpid': 25938, 'n1': 5, 'time': <module 'time' (built-in)>, '_name$
will be run by son and parent

<a id="orgcca67d6"></a>

多次 fork()

import os
import time
pid = os.fork()
if pid == 0:
    print("haha 1 %s"%(os.getpid()))
else:
    print("hehe 2 %s"%(os.getpid()))
pid = os.fork()
if pid==0:
    print("haha 3 %s %s"%(os.getpid(),os.getppid()))
else:
    print("haha 4 %s %s"%(os.getpid(),os.getppid()))
time.sleep(1)

---------------------------------------------------------–—結果
hehe 2 26877
haha 1 26878
haha 4 26877 25179
haha 4 26878 26877
haha 3 26880 26878
haha 3 26879 26877

2 與 1 分別執(zhí)行一次加匈,接下來 26878 走一遍 4,并產生一個子進程執(zhí)行 3.26877 執(zhí)行 4
并產生一個子進程執(zhí)行 3显蝌。

<a id="orge18a284"></a>

multiprocessing 模塊

Process 的 target 不僅可以傳遞函數儿捧,也可以傳遞綁定方法委造,也可以傳遞類

from  multiprocessing import Process
import os
from time import sleep
import types
def run_proc(jj,name,age,**kwargs):
    for i in range(10):
        print("son process running,name=%s,age=%di,pid=%d..."%(name,age,os.getpid()))
        print(kwargs)
        sleep(0.5)

class A:
    pass

A.run_proc=types.MethodType(run_proc,A)
a=A()
#a.run_proc(18,m=12,t=13)

if __name__=='__main__':
    print('parent process is %d'%os.getpid())
    p=Process(target=run_proc,args=(a,'hi',18,),kwargs={"m":20})
    print("son process will running")
    p.start()
    sleep(1)
    p.terminate()
    p.join()
    print("son process have end")

from  multiprocessing import Process
import os
from time import sleep
import types

class A:
    def __init__(self,name,age,**kwargs):
        for i in range(10):
            print("son process running,name=%s,age=%di,pid=%d..."%(name,age,os.getpid()))
            print(kwargs)
            sleep(0.5)
    pass


#a.run_proc(18,m=12,t=13)

if __name__=='__main__':
    print('parent process is %d'%os.getpid())
    p=Process(target=A,args=('hi',18),kwargs={"m":20})
    print("son process will running")
    p.start()
    sleep(1)
    p.terminate()
    p.join()
    print("son process have end") 

<a id="orgb98fd3a"></a>

Process 子類

from multiprocessing import Process
import time
import os

class Process_Class(Process):
    def __init__(self,interval):
        Process.__init__(self)
        self.interval = interval
    def run(self):
        print("son process (%s)start running,parent process is (%s)"%(os.getpid(),os.getppid()))
        t_start = time.time()
        time.sleep(self.interval)
        t_stop = time.time()
        print("(%s)end ..,elapsed(%0.2f)s"%(os.getpid(),t_stop-t_start))

if __name__=='__main__':
    t_start=time.time()
    print("present process is (%s)"%os.getpid())
    p1 = Process_Class(2)
    p1.start()
    p1.join()
    t_stop = time.time()
    print("(%s)end...,elapsed (%0.2f)"%(os.getpid(),t_stop-t_start))

present process is (11503)
son process (29364)start running,parent process is (11503)
(29364)end ..,elapsed(2.00)s
(11503)end…,elapsed (2.01)

<a id="org2c79c73"></a>

進程池 Pool

from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start=time.time()
    print("%s start run,pid is %d"%(msg,os.getpid()))
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"end run.elapsed time is %0.2f"%(t_stop-t_start))

po=Pool(3)
for i in range(0,10):
    po.apply_async(worker,(i,))

print("-----start------")
po.close()
po.join()
print("----end-----")

0 start run,pid is 29668
2 start run,pid is 29670
1 start run,pid is 29669
–—start-–—
2 end run.elapsed time is 0.64
3 start run,pid is 29670
3 end run.elapsed time is 0.31
4 start run,pid is 29670
4 end run.elapsed time is 0.14
5 start run,pid is 29670
0 end run.elapsed time is 1.16
6 start run,pid is 29668
5 end run.elapsed time is 0.73
7 start run,pid is 29670
1 end run.elapsed time is 1.92
8 start run,pid is 29669
6 end run.elapsed time is 0.96
9 start run,pid is 29668
7 end run.elapsed time is 0.92
8 end run.elapsed time is 1.82
9 end run.elapsed time is 1.73
-—end–—

<a id="org795128d"></a>

Queue 的表現(xiàn)

from multiprocessing import Queue
q=Queue(3) 
q.put("msg1")
q.put("msg2")
print(q.full())  #False
q.put("msg3")
print(q.full()) #True
try:
    q.put("msg4",True,2)
except:
    print("msg queue is full渗稍,now the num is:%s"%q.qsize())
try:
    q.put_nowait("msg4")
except:
    print("msg queue is full佩迟,the num is:%s"%q.qsize())
if not q.full():
    q.put_nowait("mag4")
if not q.empty():
    for i in range(q.qsize()):
        print(q.get_nowait()) 

False
True
msg queue is full团滥,now the num is:3
msg queue is full,the num is:3
msg1
msg2
msg3

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末报强,一起剝皮案震驚了整個濱河市灸姊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躺涝,老刑警劉巖厨钻,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異坚嗜,居然都是意外死亡夯膀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門苍蔬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來诱建,“玉大人,你說我怎么就攤上這事碟绑“吃常” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵格仲,是天一觀的道長押袍。 經常有香客問我,道長凯肋,這世上最難降的妖魔是什么谊惭? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮侮东,結果婚禮上圈盔,老公的妹妹穿的比我還像新娘。我一直安慰自己悄雅,他們只是感情好驱敲,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宽闲,像睡著了一般众眨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上容诬,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天围辙,我揣著相機與錄音,去河邊找鬼放案。 笑死姚建,一個胖子當著我的面吹牛,可吹牛的內容都是我干的吱殉。 我是一名探鬼主播掸冤,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼厘托,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稿湿?” 一聲冷哼從身側響起铅匹,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饺藤,沒想到半個月后包斑,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡涕俗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年罗丰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片再姑。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡萌抵,死狀恐怖,靈堂內的尸體忽然破棺而出元镀,到底是詐尸還是另有隱情绍填,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布栖疑,位于F島的核電站讨永,受9級特大地震影響,放射性物質發(fā)生泄漏遇革。R本人自食惡果不足惜卿闹,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澳淑。 院中可真熱鬧,春花似錦插佛、人聲如沸杠巡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氢拥。三九已至,卻和暖如春锨侯,著一層夾襖步出監(jiān)牢的瞬間嫩海,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工囚痴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叁怪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓深滚,卻偏偏與公主長得像奕谭,于是被迫代替她去往敵國和親涣觉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內容

  • 歷經十一載血柳,上南少林乏沸!今終上頂一覽Qセ肌!
    那些年8713閱讀 234評論 0 0
  • 雞湯文學興起于20世紀上半葉,那個時候碍论,經濟不景氣、不平等顽铸、戰(zhàn)爭等惡魔正在磨滅人類追求美好生活的心靈端盆,所以出...
    靜齋先生閱讀 608評論 1 2
  • 小木還是像個小姑娘一樣貓著腰满粗,墊著步小跑著過來,臉頰紅撲撲的愚争,一把拉開椅子映皆,坐下,看著三山臉上五年前留下的疤轰枝,語氣...
    李小鹿兒閱讀 414評論 0 0
  • 文/蔥蔥 我的眼睛里有發(fā)燒的物件 我的夢境里有斷翅的蝴蝶 我的思想里有焦灼的螞蟻 我的身子里有驕傲的氫氣 日子被雨...
    蔥蔥_閱讀 468評論 31 30