Python多进程
多进程的语法跟多线程有些相似
# 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()
以上程序运行结果是直接打印:
进程0正在运行
进程1正在运行
进程2正在运行
进程3正在运行
进程4正在运行
如果join的注释被去掉,类似多线程也变成了串行,每过5秒打印一次。
每个进程都由父进程启动
# 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()
进程间的通讯
1.多进程Queue
multiprocessing模块下的Queue通过数据传递实现进程间的通讯。本质上不是共享一个Queue,而是克隆了一个Queue,由一个中间的内存进行数据传递(数据需经过pickle)
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(进程间共享和传递数据,实际上也是克隆)
# 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]