zoukankan      html  css  js  c++  java
  • 多进程

    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

    限制几个进程同时在运行 当然这也是一种启动进程的方法 

     1 from multiprocessing import Pool
     2 def f(x):
     3     return x+x
     4 
     5 pool = Pool(processes=5)
     6 res_list = []
     7 for i in range(10):
     8     res = pool.apply_async(f,[i,])
     9     res_list.append(res)
    10 for i in res_list:
    11     i.get()

    apply_async -是异步的 apply是同步的 把进程启动了 还要等他完成

      

  • 相关阅读:
    python3下搜狗AI API实现
    辽宁移动宽带体验及魔百盒M101s-2刷机
    年会抽奖系统-支持作弊,指定中奖
    论python3下“多态”与“继承”中坑
    fiddler抓手机报文的配置指南
    微软BI套件
    IntelliJ IDEA 2018 Community(社区版)创建J2EE项目+Tomcat9部署
    Spring.net的Demo项目,了解什么是控制反转
    manjaro安装virtualbox教程
    Debian9 安装后的配置笔记
  • 原文地址:https://www.cnblogs.com/nerdlerss/p/5855105.html
Copyright © 2011-2022 走看看