多進程multiprocessing

一、多進程Processpython

調用方法:app

from multiprocessing import  Process,freeze_support
import time
def f(i):
    time.sleep(1)
    print(i)


# 這裏若是不寫if __name__ == "__main__":的話會報freeze_support()錯誤
if __name__ == "__main__":
    for i in range(10):
        p = Process(target=f,args=(i,))
        p.start()
    print("end")

 

二、隊列Queuedom

Queue爲先進先出,get()一次,Queue裏的那個被get的值會被拿走,當隊列爲空時get()方法會阻塞,async

調用方法:函數

from multiprocessing import Process,Queue
import time


def f(i,q):
    time.sleep(1)
    q.put(i)


if __name__ == "__main__":
    q = Queue()
    for i in range(2):
        p = Process(target=f,args=(i,q,))
        p.start()

    for i in range(2):
        print(q.get())

2.1 Queue中的數據是能夠在子進程間共享的。對象

from multiprocessing import Process,Queue
import random
import os

def f(q):
    if q.qsize() != 0:
        print("pid:%s get %s from queue"%(os.getpid(),q.get()))
    else:
        n = random.randrange(1,10)
        print("pid:%s put %s into the queue"%(os.getpid(),n))
        q.put(n)


if __name__ == "__main__":
    print("main pid is:%s"%os.getpid())
    q = Queue()
    p = Process(target=f,args=(q,))
    p.start()

    p1 = Process(target=f,args=(q,))
    p1.start()

第一個進程放入數據,第2個進程能夠取到,運行結果以下:blog

main pid is:7300
pid:5208 put 2 into the queue
pid:6104 get 2 from queue

  

三、Pipe隊列

示例:
from multiprocessing import Process,Queue,Pipe
import time

def f(i,conn):
    conn.send(i*10)

if __name__ == "__main__":
    parent, child = Pipe()
    for i in range(2):
        p = Process(target=f,args=(i,child))
        p.start()
    for i in range(2):
        print(parent.recv())

四、Manager,進程間數據共享進程

若是有子進程在使用Manage()對象時,在父進程不能使用這個對象,因此要等全部子進程結束即需使用p.join()後方可在父進程使用Manage()的對象。ip

若是這裏註釋join()會報:FileNotFoundError: [WinError 2] 系統找不到指定的文件。

from multiprocessing import Process,Manager
import time

def f(d,l,i):
    time.sleep(5-i)   # 最後起的進程睡眠最少時間,因此父進程不能簡單的使用p.join(),而是要把p加入p_list中,而後循環p_list,並使用join()方法
    d[i] = i*10
    l.append(i*100)


if __name__ == "__main__":
    with Manager() as m:
        d = m.dict()
        l = m.list([1,2,3])
        p_list = []
        for i in range(5):
            p = Process(target=f,args=(d,l,i,))
            p.start()
            p_list.append(p)

        for p in p_list:
            p.join()
     
        print("d:",d)
        print("l:",l)

五、進程池Pool

Pool滿時後面的進程會被掛起,當pool中一個進程結束時,掛起的進程會立刻開始執行。callback回調,將target的函數的teturn的值返回給callback函數的參數。

from multiprocessing import Process,Pool
import time

def f(i):
    print("begin:",i,time.time())
    time.sleep(i)
    print("end:",i,time.time())
    return i

def bar(i):
    if i == 9:
        print("bar:",i)

if __name__ == "__main__":
    pool = Pool(5)
    for i in range(1,10):
        pool.apply_async(func=f,args=(i,),callback=bar)
    pool.close()
    pool.join()

#執行結果:
begin: 1 1466267934.986106
begin: 2 1466267934.992107
begin: 3 1466267935.0080783
begin: 4 1466267935.0166094
begin: 5 1466267935.0236104
end: 1 1466267935.9862905
begin: 6 1466267935.9864767
end: 2 1466267936.992654
begin: 7 1466267936.9931495
end: 3 1466267938.0089972
begin: 8 1466267938.0089972
end: 4 1466267939.016981
begin: 9 1466267939.016981
end: 5 1466267940.0240061
end: 6 1466267941.9866436
end: 7 1466267943.9936304
end: 8 1466267946.0098124
end: 9 1466267948.0178423
bar: 9
相關文章
相關標籤/搜索