1. 程式人生 > >python:多進程,多進程隊列,多進程管道,Manager,進程鎖,進程池

python:多進程,多進程隊列,多進程管道,Manager,進程鎖,進程池

子進程 __name__ art get 調用 sta manage parent call

#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

import multiprocessing
import time

def run(name):
time.sleep(2)
print("process start...%s" % name)
if __name__ == "__main__":
for i in range(10):
p = multiprocessing.Process(target=run,args=("bob",))
p.start()

多進程隊列
#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

from multiprocessing import Process,Queue

def f(q):
q.put([1,"ss",None])
if __name__ == "__main__":
q = Queue()#進程隊列,通過它可以使得子進程訪問主進程的數據
p = Process(target=f,args=(q,))
p.start()
print(q.get())
p.join()

多進程管道
#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"
from multiprocessing import Pipe,Process

def fun(conn,data):
conn.send(data)
conn.send(data)
print(conn.recv())

if __name__ == "__main__":
data = "hello"
parent_conn,child_conn = Pipe()#接收管道的兩個對象
p = Process(target=fun,args=(child_conn,data,))
p.start()
print(parent_conn.recv())
print(parent_conn.recv())
parent_conn.send("word")
p.join()

多進程manager
#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

from multiprocessing import Process,Manager
import os
def f(d, l):
d[os.getpid()] =os.getppid()#存儲相應進程的pid
l.append(os.getpid())
print(l)

if __name__ == "__main__":
with Manager() as manager:
d = manager.dict()#生成一個字典
l = manager.list(range(5))#生成一個列表,默認值為0,1,2,3,4
pro_obj = []#用於存儲子進程
for i in range(10):#生成十個子進程
p = Process(target=f,args=(d,l))
p.start()
pro_obj.append(p)
for pro in pro_obj:
pro.join()

print(d)
print(l)

進程鎖
#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

from multiprocessing import Lock,Process
#進程鎖可以防止一個進程在打印數據時,另一個進程插隊進來打印數據
def f(l,d):
l.acquire()
print("hello %s" %d)
l.release()
if __name__ == "__main__":
lock = Lock()
for i in range(10):
p = Process(target=f,args=(lock,i))#註意,得把鎖也傳進去
p.start()

進程池
#!usr/bin/env python
# -*- coding:utf-8 -*-

__author__ = "Samson"

from multiprocessing import Pool,Process
import time,os

def Foo(i):
time.sleep(2)
print("in process",os.getpid())
return i + 100

def Bar(arg):
print("--exec done:",arg,os.getpid())

if __name__ == "__main__":
pool = Pool(processes=5)#允許進程池同時放入5個進程
print("主進程:",os.getpid())
for i in range(10):
# pool.apply(func=Foo,args=(i,))#串行
# pool.apply_async(func=Foo,args=(i,))#並行
pool.apply_async(func=Foo,args=(i,),callback=Bar)#並行同時調用回掉函數Bar(),註意該回掉函數是由主進程調用的
print("end")
pool.close()#關閉進程池
pool.join()#進程池中進程執行完畢後再關閉,如果註釋,那麽程序直接關閉;註意,該方法必須放在pool.close()函數後面

python:多進程,多進程隊列,多進程管道,Manager,進程鎖,進程池