day37---Manage,管道的简单应用,进程池,队列的简单应用

今日内容:

    1 生产者消费者模型       主要是为解耦       借助队列来实现生产者消费者模型

       栈:先进后出(First In Last Out       简称 FILO)       队列: 先进先出(First In First Out   简称 FIFO)

    import queue  # 不能进行多进程之间的数据传输    (1)from multiprocessing import Queue   借助Queue解决生产者消费者模型       队列是安全的。       q = Queue(num)       num : 队列的最大长度       q.get()# 阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待       q.put()# 阻塞,如果可以继续往队列中放数据,就直接放,不能放就阻塞等待

       q.get_nowait()# 不阻塞,如果有数据直接获取,没有数据就报错       q.put_nowait()# 不阻塞,如果可以继续往队列中放数据,就直接放,不能放就报错

    (2)from multiprocessing import JoinableQueue#可连接的队列       JoinableQueue是继承Queue,所以可以使用Queue中的方法       并且JoinableQueue又多了两个方法       q.join()# 用于生产者。等待 q.task_done的返回结果,通过返回结果,生产者就能获得消费者当前消费了多少个数据       q.task_done() # 用于消费者,是指每消费队列中一个数据,就给join返回一个标识。

     2 管道(了解)         from multiprocessing import Pipe         con1,con2 = Pipe()         管道是不安全的。         管道是用于多进程之间通信的一种方式。         如果在单进程中使用管道,那么就是con1收数据,就是con2发数据。                                 如果是con1发数据,就是con2收数据

         如果在多进程中使用管道,那么就必须是父进程使用con1收,子进程就必须使用con2发                                             父进程使用con1发,子进程就必须使用con2收                                             父进程使用con2收,子进程就必须使用con1发                                             父进程使用con2发,子进程就必须使用con1收         在管道中有一个著名的错误叫做EOFError。是指,父进程中如果关闭了发送端,子进程还继续接收数据,那么就会引发EOFError。

from multiprocessing import Pipecon1, con2 = Pipe()con1.send('abc')
print(con2.recv())
con2.send(123)
print(con1.recv())

单线程内的管道

from multiprocessing import Pipe, Processdef func(con):con1, con2 = concon1.close()  # 子进程使用con2和父进程通信,所以while 1:try:print(con2.recv())  # 当主进程的con1发数据时,子进程要死循环的去接收。except EOFError:  # 如果主进程的con1发完数据并关闭con1,子进程的con2继续接收时,就会报错,使用try的方式,获取错误con2.close()  # 获取到错误,就是指子进程已经把管道中所有数据都接收完了,所以用这种方式去关闭管道breakif __name__ == '__main__':con1, con2 = Pipe()p = Process(target=func, args=((con1, con2),))p.start()con2.close()  # 在父进程中,使用con1去和子进程通信,所以不需要con2,就提前关闭for i in range(10):  # 生产数据con1.send(i)  # 给子进程的con2发送数据con1.close()  # 生产完数据,关闭父进程这一端的管道

多进程下的管道


     3 进程之间的共享内存       from multiprocessing import Manager,Value       m = Manager()       num = m.dict({键 : 值})       num = m.list([1,2,3])

# Manager  子进程和主进程之间共享内存的
from multiprocessing import Process, Managerdef func(num):num[0] -= 1print('子进程中的num的值是', num)if __name__ == '__main__':m = Manager()                       # 实例化一个Manager 对象num = m.list([1, 2, 3])print(num)p = Process(target=func, args=(num,))   #  开启一个进程p.start()                               # 执行进程p.join()                                # 进程设置为同步print('父进程中的num的值是', num)

Manager共享内存


     4 进程池       进程池:一个池子,里边有固定数量的进程。这些进程一直处于待命状态,一旦有任务来,马上就有进程去处理。       因为在实际业务中,任务量是有多有少的,如果任务量特别的多,不可能要开对应那么多的进程数       开启那么多进程首先就需要消耗大量的时间让操作系统来为你管理它。其次还需要消耗大量时间让       cpu帮你调度它。       进程池还会帮程序员去管理池中的进程。       from multiprocessing import Pool       p = Pool(os.cpu_count() + 1)

       进程池有三个方法:         map(func,iterable)         func:进程池中的进程执行的任务函数         iterable: 可迭代对象,是把可迭代对象中的每个元素依次传给任务函数当参数

         apply(func,args=()): 同步的效率,也就是说池中的进程一个一个的去执行任务         func:进程池中的进程执行的任务函数         args: 可迭代对象型的参数,是传给任务函数的参数         同步处理任务时,不需要close和join         同步处理任务时,进程池中的所有进程是普通进程(主进程需要等待其执行结束)

         apply_async(func,args=(),callback=None): 异步的效率,也就是说池中的进程一次性都去执行任务         func:进程池中的进程执行的任务函数         args: 可迭代对象型的参数,是传给任务函数的参数         callback: 回调函数,就是说每当进程池中有进程处理完任务了,返回的结果可以交给回调函数,由回调函数进行进一步的处理,回调函数只有异步才有,同步是没有的         异步处理任务时,进程池中的所有进程是守护进程(主进程代码执行完毕守护进程就结束)         异步处理任务时,必须要加上close和join

         回调函数的使用:             进程的任务函数的返回值,被当成回调函数的形参接收到,以此进行进一步的处理操作             回调函数是由主进程调用的,而不是子进程,子进程只负责把结果传递给回调函数

转载于:https://www.cnblogs.com/kcwxx/p/9548918.html

Manage,管道的简单应用,进程池,队列的简单应用相关推荐

  1. 网络编程7_ multiprocessing类-管道.数据共享, 信号量,事件,进程池

    一. multiprocessing类     6. 管道     进程间通信(ipc)方式二: 管道会导致数据不安全的情况, 后面我们会说到为什么会带来数据不安全的问题     创建管道的类:    ...

  2. python (高级消息队列)普通、进程、进程池的消息队列

    一.普通消息队列 from queue import Queue  这个是普通的队列模式,类似于普通列表,先进先出模式,get方法会阻塞请求,直到有数据get出来为止. import Queueq = ...

  3. 41.进程池--Pool

    进程池 方便创建,管理进程,单独进程的Process创建,需要手动开启,维护任务函数,以及释放回收 进程池不需要这么麻烦,进程提前创建好,未来在使用的时候,可以直接给与任务函数 某个进程池中的任务结束 ...

  4. python进程池和线程池_Python中的进程池与线程池(包含代码)

    引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用submit异步调用 异步+回调函数 ...

  5. 【Python随笔】python进程池ProcessPoolExecutor的用法与实现分析

    在python开发期间,由于GIL的原因,不能直接采用并行的方式处理代码逻辑.在multiprocessing库的支持下,python程序能够启动子进程执行特定的任务,但子进程的管理也成为了问题.为了 ...

  6. python 进程池实现 pool

    进程池实现 必要性 进程的创建和销毁过程消耗的资源比较多 当任务量众多,每个任务在很短时间内完成时,需要平方的创建和销毁进程,此时对计算机压力比较大 进程池技术很好的解决了以上问题 原理 创建一定数量 ...

  7. python基础-进程池、submit同异步调用、shutdown参数、ProcessPoolExecutor进程池、进程池ftp

    引入进程池 使用ProcessPoolExecutor进程池 使用shutdown 使用submit同步调用 使用submit异步调用 进程池实现ftp 引入进程池 在学习线程池之前,我们先看一个例子 ...

  8. python—多进程之进程池

    一.进程池 1.进程池定义: 进程池:可以提供指定数量的进程给用户使用,即当有新的请求提交到进程池中时,如果池未满,则会创建一个新的进程用来执行该请求;反之,如果池中的进程数已经达到规定最大值,那么该 ...

  9. Python进程池Pool的使用

    1.进程池Pool 需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到m ...

最新文章

  1. echarts 地图实现轮播(二)
  2. Leetcode--695. 岛屿的最大面积
  3. android auto note 8,三星Galaxy Note 8.0支持flash吗
  4. [NOIp2017] 时间复杂度
  5. JS获取DropDownList的value值与text值
  6. 基于Packet Tracer的校园网络设计与规划
  7. h3c 链路聚合测试_H3CSE学习之链路聚合
  8. 吉林大学线性代数知识点及解题方法
  9. 美容院管理系统高效管理门店店务?
  10. 关于研究课题中的技术路线与实施方案
  11. 竞态条件的赋值_Go 译文之竞态检测器 race
  12. HTML页面基本结构
  13. meltdown论文翻译
  14. asp长度为4的随机数字写
  15. html超链接几种写法
  16. 用python抠图方便还是ps方便_我会Python之后都不屑用PS了,Python抠图太方便了!...
  17. 笔记本 原因代码: 0x500ff 关机类型: 关闭电源_图吧垃圾佬关于笔记本电池更换的几项建议...
  18. Android Drawable图标生成工具
  19. 关于GetProcAddress返回错误代码为127的解决方案
  20. MACD+波动率过滤+追踪止损 期货择时汇总

热门文章

  1. 图片的色彩空间转换、简单色彩跟踪与通道分离、合并(三)
  2. linux send and recv详解
  3. python里我最容易搞不清楚问题之一的encode和decode
  4. 大兄dei,早点看清this吧
  5. Dockerfile制作自定义镜像
  6. Mac OS 10.12 - 如何关闭Rootless机制?
  7. 一些关于虚拟交易的有趣文章
  8. error: #error This file requires compiler and library support for the ISO C++ 2011 standard.
  9. php可以用lucene吗,php – Lucene外国字符问题
  10. ionic 图片显示在屏幕中间_iPad屏幕坏点亮点怎么看 自查iPad屏幕坏点亮点方法【详解】...