1. 体验多进程的运行速度

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

from multiprocessing import Pool
import time

def foo(n):
    time.sleep(1)
    return n * n

if __name__ == "__main__":
    pool = Pool(10)
    data_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    # 这里只需要等待1S就能得到结果, 因为使用了多进程
    print pool.map(foo, data_list)
    # 这里需要等待10S 才能得到结果, 因为没有使用多进程
    print map(foo, data_list)

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test.py
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Process finished with exit code 0

注意:

(1)多进程的优势在于充分利用多核优势,因为多线程都是利用单核,只有多进程才能利用多核

2.子进程与父进程的关系

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

from multiprocessing import Process
import os

def info(title):
    print "+++++++++++++" + title + "++++++++++++++"
    if hasattr(os, 'getppid'):
        print "ppid: %d" % os.getppid()
    print "pid: %d" % os.getpid()

if __name__ == "__main__":
    info("main process")

    process = Process(target=info, args=("other process", ))
    process.start()
    process.join()

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test_2.py
+++++++++++++main process++++++++++++++
ppid: 490
pid: 593
+++++++++++++other process++++++++++++++
ppid: 593
pid: 594

Process finished with exit code 0

3.进程与线程的区别

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

from multiprocessing import Process
from threading import Thread

def foo(li, item):
    li.append(item)
    print li

if __name__ == "__main__":
    li = []

    #注意:进程是不共享内存的,每个进程都有独立的内存空间;可以利用多核优势;是真正意义上的并发
    print "+++++++++process+++++++++"
    for item in range(5):
        process = Process(target=foo, args=(li, item))
        process.start()
        process.join()

    #注意:线程是共享同一份内存的,每个线程都在抢占内存空间;一个时间片只有一个线程占用内存;不是真正的并发
    print "+++++++++thread++++++++++"
    for item in range(5):
        thread = Thread(target=foo, args=(li, item))
        thread.start()
        thread.join()

结果:

+++++++++process+++++++++
[0]
[1]
[2]
[3]
[4]
+++++++++thread++++++++++
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]

4. 实现进程间的内存共享(使用进程的队列)

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

from multiprocessing import Process, Queue

def foo(que, item):
    que.put(item)

if __name__ == "__main__":
    que = Queue()
    for item in range(5):
        process = Process(target=foo, args=(que, item))
        process.start()
    while True:
        print que.get()

结果:

1
2
0
3
4

5. 实现进程间的内存共享(使用Value和Array)

#!/usr/bin/env python
# _*_ coding:UTF-8 _*_

from multiprocessing import Process, Value, Array

def foo(n, a):
    n.value = 3.1415926
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == "__main__":

    # 这里采用多进程提供的Value对象和Array对象
    num = Value('d', 0)
    arr = Array('i', range(10))

    # 调用foo方法,修改子进程的内存数据
    process = Process(target=foo, args=(num, arr))
    process.start()
    process.join()

    # 打印主进程定义的使用Value和Array定义的数据,发现也被修改;从而断定子进程与主进程共享了内存空间
    print num.value
    print arr[:]

结果:

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test_5.py
3.1415926
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

Process finished with exit code 0

6. 使用进程池开启进程

#!/usr/bin/env python
#! _*_ coding:UTF-8 _*_

from multiprocessing import Pool
import time

def foo(x):
    print x * x
    time.sleep(1)
    return x * x

if __name__ == "__main__":

    # 这里定义进程池,每次最多只有4个进程并行运行
    pool = Pool(processes=4)

    res_list = []
    for i in range(10):
        # 开启新的进程并启动,相当于Process(target=foo, args=(i))
        res = pool.apply_async(foo, (i, ))
        # 要将进程的运行结果放入列表中,这时其实进程还还有执行函数foo
        res_list.append(res)

    for item in res_list:
        # 只有在区结果的时候,进程才真正执行函数
        print item.get()

结果:看见每个时间段只有4个进程运行

/Users/liudaoqiang/PycharmProjects/numpy/venv/bin/python /Users/liudaoqiang/Project/python_project/day24/processing_test_6.py
0
1
4
9
16
25
36
0
1
49
4
9
64
81
16
25
36
49
64
81

Process finished with exit code 0

老男孩python学习自修第二十四天【多进程】的更多相关文章

  1. 老男孩python学习自修第十四天【序列化和json】

    序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...

  2. 老男孩python学习自修第十六天【常用模块之sys和os】

    例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...

  3. 老男孩python学习自修第二十三天【多线程】

    1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...

  4. 老男孩 python学习自修第二十二天【文件上传与下载】

    1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...

  5. 老男孩python学习自修第十九天【异常处理】

    1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...

  6. 老男孩python学习自修第十五天【常用模块之time】

    例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...

  7. 老男孩python学习自修第十天【三元表达式与lambda表达式】

    例如: 1.使用三元表达式给变量赋值 result = '空' if x == None else x 2.使用lambda定义函数 add = lambda x, y: x+y

  8. Python学习笔记(十四)

    Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...

  9. Python学习笔记(十四):模块高级

    以Mark Lutz著的<Python学习手册>为教程,每天花1个小时左右时间学习,争取两周完成. --- 写在前面的话 2013-7-23 21:30 学习笔记 1,包导入是把计算机上的 ...

随机推荐

  1. 【转】svn冲突问题详解 SVN版本冲突解决详解

    (摘自西西软件园,原文链接http://www.cr173.com/html/46224_1.html) 解决版本冲突的命令.在冲突解决之后,需要使用svnresolved来告诉subversion冲 ...

  2. php 依赖注入的实现

    当A类需要依赖于B类,也就是说需要在A类中实例化B类的对象来使用时候,如果B类中的功能发生改变,也会导致A类中使用B类的地方也要跟着修改,导致A类与B类高耦合.这个时候解决方式是,A类应该去依赖B类的 ...

  3. https基础

    面试题 https://blog.csdn.net/xihuangwutong/article/list/5? TLS 有三大功能:内容加密,身份认证,数据完整性认证 内容加密是依赖于秘钥协商协议数据 ...

  4. 13 python初学(函数)

    函数: 概念:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 创建: def 函数名命名规范: a. 必须以下划线或字母开头 b. 区分大小写 c.不能 ...

  5. node.js如何引用其它js文件

    以Java来说,比如要实现第三方存储,我可能需要导入对应的库,以maven为例,使用腾讯云或者七牛云.阿里云,我需要导入对应的maven依赖.再比如,有些时候我们封装某个类,而那个类不在该包下,我们需 ...

  6. [MicroPython]TPYBoard v102炫彩跑马灯WS2812B

    一.实验目的 了解ws2812b的工作原理 学习ws2812b的驱动方法 二.实验器材 TPYBoard v102 1块 ws2812b RGB-Ring-8 1个 micro USB数据线 1条 杜 ...

  7. BZOJ4361 isn 树状数组、DP、容斥

    传送门 不考虑成为非降序列后停止的限制,那么答案显然是\(\sum\limits_{i=1}^N cnt_i \times (N-i)!\),其中\(cnt_i\)表示长度为\(i\)的非降序列数量 ...

  8. 极其好用好学的规则引擎 - A2D规则引擎

    写了个简单的规则引擎,普通情况够用了: 比如2家公司有各自的利率计算规则,如下: 在C#方面,没有写在C#的业务逻辑代码中,而是移到了外部规则文件中,如(ACompanyRatePolicy.r): ...

  9. Visual studio 2015 Community 安装过程中遇到问题的终极解决

    早就有给自己电脑升级VS的想法,可是安装过程并不顺利,一直拖到现在,昨天下定决心,把遇到的问题一个个解决,终于安装成功了,将安装过程中遇到的问题和解决方法记录一下. 需要说明一下的是,不同的电脑环境可 ...

  10. 平均精度均值(mAP)——目标检测模型性能统计量

    在机器学习领域,对于大多数常见问题,通常会有多个模型可供选择.当然,每个模型会有自己的特性,并会受到不同因素的影响而表现不同. 每个模型的好坏是通过评价它在某个数据集上的性能来判断的,这个数据集通常被 ...