進程是由系統自己管理的。
1:最基本的寫法
from multiprocessing import Pooldef f(x): return x*xif __name__ == '__main__': p = Pool(5) print(p.map(f, [1, 2, 3]))[1, 4, 9]
2、實際上是通過os.fork的方法產生進程的
unix中,所有進程都是通過fork的方法產生的。
multiprocessing Processosinfo(title): title , __name__ (os, ): , os.getppid() , os.getpid()f(name): info() , name__name__ == : info() p = Process(=f, =(,)) p.start() p.join()
3、線程共用記憶體
threadingrun(info_list,n): info_list.append(n) info_list__name__ == : info=[] i (): p=threading.Thread(=run,=[info,i]) p.start()[0][0, 1][0, 1, 2][0, 1, 2, 3][0, 1, 2, 3, 4][0, 1, 2, 3, 4, 5][0, 1, 2, 3, 4, 5, 6][0, 1, 2, 3, 4, 5, 6, 7][0, 1, 2, 3, 4, 5, 6, 7, 8][0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
進程不共用記憶體:
multiprocessing Processrun(info_list,n): info_list.append(n) info_list__name__ == : info=[] i (): p=Process(=run,=[info,i]) p.start()[1][2][3][0][4][5][6][7][8][9]
若想共用記憶體,需使用multiprocessing模組中的Queue
multiprocessing Process, Queuef(q,n): q.put([n,])__name__ == : q=Queue() i (): p=Process(=f,=(q,i)) p.start() : q.get()
4、鎖:僅是對於螢幕的共用,因為進程是獨立的,所以對於多進程沒有用
multiprocessing Process, Lockf(l, i): l.acquire() , i l.release()__name__ == : lock = Lock() num (): Process(=f, =(lock, num)).start()hello world 0hello world 1hello world 2hello world 3hello world 4hello world 5hello world 6hello world 7hello world 8hello world 9
5、進程間記憶體共用:Value,Array
multiprocessing Process, Value, Arrayf(n, a): n.value = i ((a)): a[i] = -a[i]__name__ == : num = Value(, ) arr = Array(, ()) num.value arr[:] p = Process(=f, =(num, arr)) p.start() p.join()0.0[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]3.1415927[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
#manager共用方法,但速度慢
multiprocessing Process, Managerf(d, l): d[] = d[] = d[] = l.reverse()__name__ == : manager = Manager() d = manager.dict() l = manager.list(()) p = Process(=f, =(d, l)) p.start() p.join() d l# print '-------------'這裡只是另一種寫法# print pool.map(f,range(10)){0.25: None, 1: '1', '2': 2}[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
#非同步:這種寫法用的不多
multiprocessing Pooltimef(x): x*x time.sleep() x*x__name__ == : pool=Pool(=) res_list=[] i (): res=pool.apply_async(f,[i]) res_list.append(res) r res_list: r.get(timeout=10) #逾時時間
同步的就是apply