首页 > 代码库 > 多进程

多进程

01最简单的使用

1 from multiprocessing import Pool2 3 def f(x):4     return x*x5 if __name__ == "__main__":6     p = Pool(5)7     print (p.man(f,[1,2,3]))

02子进程与父进程

我们知道父进程派生子进程 但是内存空间却是独立的 而子进程都是父进程通过fork方法过程

也就是 复制了一份 当容量比较大的程序 要慎重使用多线程

 1 from multiprocessing import Process 2  3 import os 4  5 def info(title): 6     print title 7     print "module name:",__name__ 8     if hasattr(os,getppid): 9         print parent process:,os.getppid()10     print process id:,os.getpid()11 12 def f(name):13     info(funtion f)14     print hello,name15 16 if __name__ == "__main__ ":17     info("main line")18     print "-----------"19     p = Process(target=f,args=(bob,))20     p.start()21     p.join()

03进程锁

类似多线程的线程锁,但是我们知道进程是独立的内存,工作不干扰的 那么这个功能没有太多用处,可能用在 多个进程同一平面输出

 1 from multiprocessing import Process ,Lock 2 import  time 3 def f (l,i): 4  5     l.acquire() 6     print hello world,i 7     l.release() 8  9 if __name__ =="__main__":10     lock =Lock()11 12     for num in range(10):13         Process(target=f,args=(lock,num)).start()

04 进程间通信 

进程是内存独立呢 那么如何进行进程间通信呢?就只有借助其他东西承载

也就是两个内存空间的桥梁

  【1】 Queue

 1 from multiprocessing import Process ,Queue 2  3 def f(q,n): 4     q.put([n,hello]) 5      6 if __name__ == "__main__": 7     q = Queue() 8     for i in range(5): 9         p = Process(target=f,args=(q,i))10         p.start()11     print q.get()

  【2】Value and Array

 1 from multiprocessing import Value,Array,Process 2 def f(n,a,raw): 3     n.value = http://www.mamicode.com/3.15"color: #008080;"> 4     for i in range(5): 5         a[i] = -a[i] 6         raw.append(999) 7         print raw 8 if __name__ =="__main__": 9     num  = Value(d,0.0)10     arr  = Array(i,range(10))11     raw_list = range(10)12     print num.value13     print arr[:]14     p = Process(target=f,args=(num,arr,raw_list))15     p.start()16     p.join()17 18     print num.value19     print arr[:]

  【3】manager

 

 1 from multiprocessing import Manager ,Process 2  3 def f (d,l): 4     d[1] = 1 5     d[2] = 2 6     d[0.25]= None 7     l.reverse() 8  9 if  __name__ =="__main__":10     manager = Manager()11 12     d = manager.dict()13     l = manager.list(range(10))14     p = Process(target=f,args=(d,l))15     p.start()16     p.join()17 18     print d19     print l

manager 是比较慢的一种空间方式,但是能把字典传过去 而且manager还可以在两台不同主机间传递

05进程池-Pool

限制几个进程同时在运行

 

多进程