• python中multiprocessing模块


    multiprocess模块那来干嘛的?

    答:利用multiprocessing可以在主进程中创建子进程。Threading是多线程,multiprocessing是多进程。

    #该模块和Threading模块使用方法基本类似。

    • 首先需要说明,你所使用多线程的函数不能有return,比如你要将job这个函数多线程那么在job这个函数里就不能有return,如果有返回值请看文章。
    • multiprocessing最好写在if __name__ == '__main__'当中,如果不放在这里面,windows可能会出错。其余环境则不会出现这种情况。我第一个案例没有加,第二个案例加了。

    案例:

     1 #!usr/bin/env python
     2 #encding:utf-8
     3 #by i3ekr
     4 
     5 import multiprocessing,time
     6 
     7 def job(q,a):#将Queue当参数传入,且必须放在首位。
     8     time.sleep(3)
     9     print 'this is test...%s'%(a)
    10 
    11 
    12 start = time.time()
    13 q = multiprocessing.Queue()#定义一个Queue,这个Queue是必须的。
    14 p1 = multiprocessing.Process(target=job,args=(q,1))#创建一个线程,第一个q是Queue,第二个是参数的value。如果没有参数的话必须要(q,)逗号是必须要加的
    15 p2 = multiprocessing.Process(target=job,args=(q,2))
    16 p1.start()
    17 p2.start()
    18 p1.join()
    19 p2.join()
    20 end = time.time()
    21 print("run time is %s"%(end-start))

    输出结果:

    root@i3ekr:/home/i3ekr/Desktop# python 1.py 
    this is test...1
    this is test...2
    run time is 3.0163371563


     那么函数有返回值的时候怎么做?

    使用队列.put()进行保存值。使用get得到返回值。如下案例所示:

    需要注意得是:

    • 有多少个返回值就要有多少个get。并不是一下子把所有得返回值全都一起输出之类得。如下代码20-21行,因为有两个线程,所以执行了两遍job函数,所以也有两个返回值。故也必须要有两个get去得到value
     1 #!usr/bin/env python
     2 #encding:utf-8
     3 #by i3ekr
     4 
     5 import multiprocessing,time
     6 
     7 def job(q,a):
     8     time.sleep(3)
     9     q.put(a)#得到a
    10 
    11 
    12 if __name__ == '__main__':
    13     start = time.time()
    14     q = multiprocessing.Queue()
    15     p1 = multiprocessing.Process(target=job,args=(q,1))
    16     p2 = multiprocessing.Process(target=job,args=(q,2))
    17     p1.start()
    18     p2.start()
    19     p1.join()
    20     p2.join()
    21     res1 = q.get()#得到job得返回值
    22     res2 = q.get()
    23     print res1,res2
    24     end = time.time()
    25     print("run time is %s"%(end-start))

    输出结果:

    root@i3ekr:/home/i3ekr/Desktop# python 1.py
    1 2
    run time is 3.01186394691


    当然上面那个方法不是那么友好,在python里有线程池的概念。通过线程池可以更好的解决这个问题。

    线程池是什么?

    • 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务

    线程池做法思路:

    1. 先建立一个方法(即函数)专门用来放池子。例如:def multipro():
    2. 建立线程池。例如:po = multiprocessing.Pool()
    3. 通过线程池去实现方法(就是调用需要实现的功能,job是要实现多进程得功能函数)例如:res=po.map(job,range(10))
    4. map是mulprocessing的方法。

    整理得出以下代码:

     1 #!usr/bin/env python
     2 #encding:utf-8
     3 #by i3ekr
     4 
     5 import multiprocessing,time
     6 
     7 def job(a):
     8     return a*a
     9 
    10 def multipro():
    11     po = multiprocessing.Pool()#该处默认启用得是所有的核数,可以通过Pool(multiprocessing=3)这样去设置。
    12     res=po.map(job,range(10))
    13     print res
    14 
    15 if __name__ == '__main__':
    16     multipro()

    除了map还有apply_async、

    使用方法:res = po.apply_async(job,(2,))

     1 #!usr/bin/env python
     2 #encding:utf-8
     3 #by i3ekr
     4 
     5 import multiprocessing,time
     6 
     7 def job(a):
     8     return a*a
     9 
    10 def multipro():
    11     po = multiprocessing.Pool()
    12     res=po.apply_async(job,(2,))#如果是只有一个参数依旧是一个可迭代的对象,所以需要多加一个逗号。
    13     print res.get()#通过get得到返回值
    14 
    15 if __name__ == '__main__':
    16     multipro()

    运行结果:

    root@i3ekr:/home/i3ekr/Desktop# python 1.py
    2

    可以将apply_async用得更高级。做成一个迭代器。

     1 #!usr/bin/env python
     2 #encding:utf-8
     3 #by i3ekr
     4 
     5 import multiprocessing,time
     6 
     7 def job(a):
     8     return a
     9 
    10 def multipro():
    11     po = multiprocessing.Pool()
    12     res=[po.apply_async(job,(i,)) for i in range(10)]
    13     print([res.get() for res in res])#迭代res返回res给res.get
    14 
    15 if __name__ == '__main__':
    16     multipro()

    进程锁


    跟Theading一样,会去抢内存。如果不了解得可以参考:http://www.cnblogs.com/xishaonian/p/7624736.html

    基础知识:

    • acquire()#上锁
    • release()#解锁 
  • 相关阅读:
    XPSP2 PSDK(还有lostspeed)
    给c++程序员的一份礼物——常用工具集
    setStyleSheet来设定窗口部件的样式
    Guava学习笔记:Immutable(不可变)集合
    迷你MVVM框架 avalonjs 0.82发布
    看到他我一下子就悟了-- 反射
    C# Socket编程
    Exchange Server 2013 一步步安装图解
    编码标准之格式
    Drupal与大型网站架构(译)- Large-Scale Web Site Infrastructure and Drupal
  • 原文地址:https://www.cnblogs.com/nul1/p/8964843.html
Copyright © 2020-2023  润新知