多进程

Posted nerdlerss

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程相关的知识,希望对你有一定的参考价值。

01最简单的使用

1 from multiprocessing import Pool
2 
3 def f(x):
4     return x*x
5 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,name
15 
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 = 3.15
 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.value
13     print arr[:]
14     p = Process(target=f,args=(num,arr,raw_list))
15     p.start()
16     p.join()
17 
18     print num.value
19     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 d
19     print l

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

05进程池-Pool

限制几个进程同时在运行

 

以上是关于多进程的主要内容,如果未能解决你的问题,请参考以下文章

线程学习知识点总结

多线程编程

多线程编程

多个请求是多线程吗

python多线程

python中的多线程和多进程编程