Python3 多进程编程(Multiprocess programming)

为什么使用多进程

  python中的多线程其实并不是真正的多线程,不能充分地使用多核CPU的资源,此时需要使用需要使用多进程解决问题。

具体用法

  Python中的多进程是通过multiprocessing模块来实现的,和多线程的threading.Thread类似,利用multiprocessing.Process来创建一个进程对象。进程对象的方法和线程对象的方法类似,也有start(), join()等。

  • 直接启用

    代码实例
    import multiprocessing
    from time import sleep def clock(interval):
    i = 0
    while i<5:
    i += 1
    print(f"Run >>> {i}")
    sleep(interval)
    print("Ending!") if __name__ == '__main__':
    p = multiprocessing.Process(target = clock, args = (1,))
    p.start()
    p.join()
    运行结果
    Run >>> 1
    Run >>> 2
    Run >>> 3
    Run >>> 4
    Run >>> 5
    Ending!
  • 继承自multiprocessing.Process调用

    与多线程使用方法类似

    • 直接继承Process
    • 重写run函数
    • 类实例可以直接运行
    代码实例
    import multiprocessing
    from time import sleep class ClockProcess(multiprocessing.Process):
    def __init__(self, interval):
    super().__init__()
    self.interval = interval def run(self):
    i = 0
    while i<5:
    i += 1
    print(f"Run >>> {i}")
    sleep(self.interval)
    print("Ending!") if __name__ == '__main__':
    p = ClockProcess(1)
    p.start()
    p.join()
    运行结果
        Run >>> 1
    Run >>> 2
    Run >>> 3
    Run >>> 4
    Run >>> 5
    Ending!
  • 守护进程

    • 设置该进程为守护进程,即认为此进程不重要,主进程结束后,该进程随即结束。
    • 用法Process.daemon = Ture
    未使用守护进程
    import multiprocessing
    from time import sleep def clock(interval):
    i = 0
    while i<5:
    i += 1
    print(f"Run >>> {i}")
    sleep(interval)
    print("Ending!") def run():
    p = multiprocessing.Process(target = clock, args = (1,))
    p.start() if __name__ == '__main__':
    run()
    sleep(2)
    print("ENDING!")
    运行结果
    Run >>> 1
    Run >>> 2
    ENDING!
    Run >>> 3
    Run >>> 4
    Run >>> 5
    Ending!
    使用守护进程
    import multiprocessing
    from time import sleep def clock(interval):
    i = 0
    while i<5:
    i += 1
    print(f"Run >>> {i}")
    sleep(interval)
    print("Ending!") def run():
    p = multiprocessing.Process(target = clock, args = (1,))
    p.daemon = True
    p.start() if __name__ == '__main__':
    run()
    sleep(2)
    print("ENDING!")
    运行结果
    Run >>> 1
    Run >>> 2
    ENDING!

Python多线程的通信

  进程是系统独立调度核分配系统资源的基本单位,进程之间是相互独立的,进程之间的数据也不能共享,这是多进程在使用中与多线程最明显的区别。

  所以要使用多进程来弥补Python中多线程的不足,解决多进程之间的通信时关键。

进程对列Queue

  在python多进程中,Queue其实就是进程之间的数据管道,实现进程通信。

生产者消费者问题

  • 仓库(固定大小的中间缓冲区)

  • 生产者

    持续生产数据传入仓库

  • 消费者

    持续从仓库总提取数据

  在实际运行时会产设的问题。生产者的主要作用是生成一定量的数据放到仓库中,然后重复此过程。

  与此同时,消费者也在仓库消耗这些数据。该问题的关键就是要保证生产者不会在仓库满时加入数据,消费者也不会在仓库空时消耗数据。

JoinableQueue

  • JoinableQueue同样通过multiprocessing使用。

  • JoinableQueue([maxsize]):就是一个Queue对象,但允许项目的使用者通知生成者项目已经被成功处理。

  • maxsize是队列中允许最大项数,省略则无大小限制。

  • 方法介绍:

    JoinableQueue与Queue对象的方法一致,且之外还具有:

    • JoinableQueue.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常。
    • JoinableQueue.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用JoinableQueue.task_done()方法为止。

Queue实例

  • 使用JoinableQueue实现生产者消费者模型

    代码

    import multiprocessing
    from time import ctime,sleep def consumer(input_q):
    print("消费开始:", ctime())
    while True:
    # 处理项
    item = input_q.get()
    print ("消费 >>>>>>>>>", item) # 此处替换为有用的工作
    input_q.task_done() # 发出信号通知任务完成
    sleep(1)
    print ("消费结束:", ctime()) ##此句未执行,因为q.join()收集到四个task_done()信号后,主进程启动,未等到print此句完成,程序就结束了 def producer(sequence, output_q):
    print ("生产开始:", ctime())
    for item in sequence:
    output_q.put(item)
    print ("生产 >>>>>>>>>", item)
    sleep(1)
    print ("生产结束:", ctime()) if __name__ == '__main__':
    q = multiprocessing.JoinableQueue()
    # 运行消费者进程
    cons_p = multiprocessing.Process (target = consumer, args = (q,))
    cons_p.daemon = True
    cons_p.start() # 生产多个项,sequence代表要发送给消费者的项序列
    # 在实践中,这可能是生成器的输出或通过一些其他方式生产出来
    sequence = [1,2,3,4]
    producer(sequence, q)
    # 等待所有项被处理
    q.join()
    运行结果
    生产开始: Wed Oct 16 22:06:11 2019
    生产 >>>>>>>>> 1
    消费开始: Wed Oct 16 22:06:11 2019
    消费 >>>>>>>>> 1
    生产 >>>>>>>>> 2
    消费 >>>>>>>>> 2
    生产 >>>>>>>>> 3
    消费 >>>>>>>>> 3
    生产 >>>>>>>>> 4
    消费 >>>>>>>>> 4
    生产结束: Wed Oct 16 22:06:15 2019

管道Pipe

待续

Python3 多进程编程 - 学习笔记的更多相关文章

  1. Python3 多线程编程 - 学习笔记

    线程 什么是线程 特点 线程与进程的关系 Python3中的多线程 全局解释器锁(GIL) GIL是啥? GIL对Python程序有啥影响? 改善GIL产生的问题 Python3关于多线程的模块 多线 ...

  2. python多进程编程学习笔记

    摘自[https://www.cnblogs.com/chenhuabin/p/10070996.html] by 奥辰 赞

  3. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  4. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  5. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  6. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  7. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  8. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  9. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

随机推荐

  1. Java学习之DOS基础

    Dos命令行dir:列出当前目录下的文件和文件夹md :创建目录rd :删除目录cd :进入指定目录cd..:退回到上一级目录cd/:退回到根目录del:删除文件exit:退出dos命令行 进入dos ...

  2. 1、获取APP 冷/热启动时间

    最近在研究Android APP性能测试.所以发现一些有趣的东西,在这里进行分享.我们先讲第一个内容,如何获取APP冷/热启动时间?为什么要做这个测试,道理其实很简单,如果启动APP特别耗时的话,用户 ...

  3. 20. Jmeter抓包之APP请求

    APP测试过程中我们经常需要抓包,通常我们使用fiddler或者Charles.但是jmeter也可以抓包,而且非常好用,闲话不多说,下面进入正题. 步骤: 1.选择测试计划,添加线程组 2.选择工作 ...

  4. java有序列表

    关于有序和无序的定义: 有序:有序列表中的元素具有某种内在的关联,这种关联定义了列表之间的顺序 无序:无序列表中的元素按使用者所选择得任意方式排序 索引:索引列表为他的元素维护一段连续的数字索引值 有 ...

  5. export 与 export default

    export 和 import 都属于 ES6 的内容. node 的 module 遵循的是 CommonJS规范,requirejs遵循AMD,seajs遵循CMD,虽各有不同, 但总之还是希望保 ...

  6. 高效IO之File文件操作类的基础用法(二)

    更多Android高级架构进阶视频学习请点击:https://space.bilibili.com/474380680 前言 众所周知Java提供File类,让我们对文件进行操作,下面就来简单整理了一 ...

  7. centos yum 安装 tomcat

    1.安装 yum install tomcat 2.卸载 yum remove tomcat 3.地址映射 http://localhost:8080/ /usr/share/tomcat/webap ...

  8. 2019-4-26-VisualStudio-开发文件自定义工具单文件生成工具

    title author date CreateTime categories VisualStudio 开发文件自定义工具单文件生成工具 lindexi 2019-04-26 10:49:32 +0 ...

  9. java ThreadPoolExecutor 异常捕获

    一,创建一个线程池 其中: public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) 饱和策略执行时的具体逻辑. p ...

  10. drop,delete与truncate的区别

    drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据,可以加where字句. (1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将 ...