多進程的語法跟多線程有些類似多線程
# coding=utf-8 import multiprocessing import time def run(index): print u'進程{}正在運行'.format(str(index)) time.sleep(5) if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=run, args=(i,)) p.start() # p.join()
以上程序運行結果是直接打印:app
進程0正在運行
進程1正在運行
進程2正在運行
進程3正在運行
進程4正在運行socket
若是join的註釋被去掉,相似多線程也變成了串行,每過5秒打印一次。spa
每一個進程都由父進程啓動線程
# coding=utf-8 from multiprocessing import Process import os def info(title): print title print 'module name:', __name__ # print 'parent process:', os.getppid() # 打印父進程id(只在Unix和Linux系統中有效) print 'process id:', os.getpid() # 打印當前進程id print '\n\n' def f(name): info('\033[31:1mfunction f\033[0m') print('hello', name) if __name__ == '__main__': info('\033[32;1mmain process line\033[0m') p = Process(target=f, args=('bob',)) p.start() p.join()
進程間的通信code
1.多進程Queueorm
multiprocessing模塊下的Queue經過數據傳遞實現進程間的通信。本質上不是共享一個Queue,而是克隆了一個Queue,由一箇中間的內存進行數據傳遞(數據需通過pickle)blog
from multiprocessing import Process, Queue def f(q): q.put('666') if __name__ == '__main__': q = Queue() p = Process(target=f, args=(q,)) p.start() p.join() print q.get() # 輸出666
2.Pipe管道進程
# coding=utf-8 from multiprocessing import Process, Pipe def f(child_conn): child_conn.send([1, 2, 3]) print child_conn.recv() child_conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() # Pipe方法返回管道(Pipe)的兩頭,兩個進程分別經過管道的兩頭通信。此方法與socket用法類似 p = Process(target=f, args=(child_conn,)) p.start() print parent_conn.recv() parent_conn.send(u'已收到!') p.join()
3.Manager(進程間共享和傳遞數據,實際上也是克隆)ip
# coding=utf-8 from multiprocessing import Process, Manager import os def f(d, l): d[os.getpid()] = os.getpid() l.append(os.getpid()) if __name__ == '__main__': with Manager() as manager: d = manager.dict() # 建立一個可用於進程間共享和傳遞的字典 l = manager.list(range(3)) # 建立一個可用於進程間共享和傳遞的列表 p_list = [] for i in range(10): p = Process(target=f, args=(d, l)) p.start() p_list.append(p) for p in p_list: p.join() print d print l 輸出: {2960: 2960, 4504: 4504, 7528: 7528, 11880: 11880, 4436: 4436, 14160: 14160, 8568: 8568, 6484: 6484, 792: 792, 9336: 9336} [0, 1, 2, 792, 6484, 8568, 14160, 9336, 7528, 2960, 4504, 4436, 11880]