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. idea整合springboot,访问templates下html资源问题

    1.pom.xml文件中要引入themyleaf 2.在application.properties文件中加入 #拼接html前后缀spring.resources.static-locations= ...

  2. 1242 斐波那契数列的第N项

    1242 斐波那契数列的第N项  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题   斐波那契数列的定义如下:   F(0) = 0 F(1) = 1 F(n) = F( ...

  3. 关于iframe定位碰到的问题。

    这几天在做自动化测试的时候发现一个问题,用JQUERY定位时,总是报错,MES:JQUERY IS NOT DEFINED. 检查自己定位没有问题,后来想是不是语法出了问题. 切换成XPATH来定位, ...

  4. 虚拟机安装VMware Tools, 安装gcc编译器

    一.虚拟机安装VMware Tools 1.虚拟机=>安装VMware Tools 2.打开文件,将下载的压缩包VMwareTools-10.3.10-12406962.tar.gz移动到指定安 ...

  5. iptables简介及常用命令

    相关文件 iptables服务配置文件 -rw-------. 1 root root 2374 9月 4 2017 /etc/sysconfig/iptables-config iptables规则 ...

  6. ASP.Net 第一天笔记 MVC 控制器与视图数据传递注意事项

    1.如果方法的参数的名称与表单元素Name属性的值一致的话,会自动填充 2.如果表单元素的Name属性与实体类型中属性一致,那么表单中的数据会自动赋值给实体中的属性 3.控制器中重载的方法 方法前上边 ...

  7. 关于tp验证码模块

    转自https://blog.csdn.net/u011415782/article/details/77367280 ♜ 功能开发 1).引入第三方扩展包 进行 TP5 的开发,Composer 的 ...

  8. Red5流媒体服务器开发

    Red5流媒体服务器开发总结 Red5 是 支持Windows,Linux等多平台的RTMP流媒体服务器,最早属于谷歌下的开源项目,先已移植到Github,地址为https://github.com/ ...

  9. ARM 汇编指 跳转指令 b , bl

    1. 跳转指令 [ b ] [ bl ]   指令格式:<opcode><cond> <address> 不带返回的跳转指令:b mov r0, #0x12 mov ...

  10. Wordpress 文章编辑页面添加 metabox

    add_meta_box($id,$title,$callback,$screen,$context:,$priority); 参数 $id (字符串)(必需)Meta模块的 HTML"ID ...