?在同一時(shí)間使用多個(gè)進(jìn)程同時(shí)運(yùn)行牢裳,可能導(dǎo)致反饋數(shù)據(jù)順序是亂的芍锚,為保證得到理想的數(shù)據(jù)順序,就需要添加一把鎖以控制數(shù)據(jù)的順序輸出砂客。
from?multiprocessing?import?Manager,Pipe,Process,os,?Lock
def?t(lock,d,l):
????lock.acquire()??#?加鎖
????try:
????????d[os.getpid()]?=?os.getpid()
????????l.append(os.getpid())
????finally:
????????lock.release()??#?釋放
if?__name__?=='__main__':
????#?parent_cnn,?child_cnn?=?Pipe()??#?管道生成兩個(gè)實(shí)例
????lock?=?Lock()
????with?Manager()?as?manager:
????????d?=?manager.dict()
????????l?=?manager.list(range(10))?#?聲明一個(gè)[0,1,2,3....,9]的列表
????????p_list?=?[]
????????for?i?in?range(5):
????????????p?=?Process(target=t,args=(lock,?d,l))
????????????#?p.daemon?=?True
????????????p.start()
????????????p_list.append(p)
????????for?j?in?p_list:
????????????j.join()
????????print?d?#?{11160:?11160,?11161:?11161,?11162:?11162,?11163:?11163,?11164:?11164}
????????print?l?#?[0,?1
#?進(jìn)程池
from?multiprocessing?import?Process,?Pool,?Lock
import?os,?time
def?f(i):
????time.sleep(1)
????print('hello',os.getpid())
def?Bar(*args):
????print('程序完成之后花椭,主進(jìn)程進(jìn)行回調(diào)...',os.getpid())
if?__name__?==?'__main__':
????pool?=?Pool(5)?#?創(chuàng)建進(jìn)程池
????print(os.getpid())
????for?i?in?range(10):
????????#?pool.apply(func=f,?args=(i,))??#?串行執(zhí)行
????????pool.apply_async(func=f,?args=(i,),?callback=Bar)??
????????#?并行執(zhí)行?callback?為回調(diào)函數(shù),指的是執(zhí)行完func之后才會(huì)執(zhí)行的方法函數(shù)
????????#?pool.apply_async(func=f,?args=(i,))
????pool.close()
????pool.join()
????print('end')