python之multiprocessing,Process,进程池,进程通信 由于该软件是跨平台的平台, 所以自然也要提供支持。因此需要提供多进程支持功能。这个模块就是专门用于实现跨平台版本的多进程功能的模块。在创建⼦进程的时候, 只需要传⼊⼀个要执行的函数以及这个函数的参数, 然后创建 ⼀个实例。接着, 通过调用 start()⽅法来启动它。这样做的话, 创建进程的事情就会变得比使用 fork()更加简单一些。join方法可以让程序停下来, 一直等到子进程全部都执行完毕之后, 再继续进行下面的操作, 这种做法通常是用到各个不同进程之间需要做到同步配合的情况之中。语法结构如下()这个标记用来表示该进程实例所调用的目标对象。args, 这个名词, 是在讲那个被调用的一方, 它所使用的, 那些个位置参数所组成的元组。这里的这个冒号, 代表的含义就是, 用来调用某个对象的时候, 所对应的那个关键字参数构成的字典。name: 是当前进程实例的别名。在大多数的场景里头那个叫作 group 的东西, 基本上是用不到的。该类里面包含了常用的那些方法。进行判断, 看看这个进程实例是不是还在那里运行。join()这个函数是用来决定是不是要等待那个进程实例执行完, 或者是指定等待多长的秒数。start(): 启动进程实例创建⼦进程。当执行该对象的方法之时, 倘若未提供任何参数, 系统便会在内部自动触发并运行位于对象内部的方法。(): 不管这一项任务最终完成了没有, 必须马上就要停止工作。类常⽤属性这里的name指的是当前进程实例的别名, 如果不去特别指定, 它会有一个默认情况, 这个默认的表示方法是用-N这样的形式去表达, 这里的N是一个从1开始一直往上递增的整数。: 当前正在运行的进程实例里面的那个叫做PID的值, 也就是它的识别编号。进程创建创建一个新的进程还可以采用类的方式进行处理。具体操作是自定义一个特定的类, 并完成对该类的继承动作。当在后续代码中对这个自定义的类每一次执行实例化操作的时候, 这一行为的实际效果就等同于直接实例化了一个专门用于表示进程的独立对象。导入继承将run这个方法的代码逻辑进行重新书写。在启动的时候, 需要去调用一个方法, 而调用这个方法的对象, 就是你自己。p1(1)请调用start方法来启动线程。p1.jion()进程池pool当我们要创建的子进程的数量比较少的这个情况的时候, 咱们就可以直接用那些动态的方法去生成出来多个进程。但是如果目标的数量达到了上百甚至上千的这个规模的话, 手动去创建进程的工作量就会变得非常巨大。在这种状况之下, 我们其实就可以使用那个模块里面提供的Pool这个方法了。当执行初始化操作时, 可以指定一个最大进程数。如果池中没有满, 那么有新建任务提交时, 就会创建一个新的进程用于执行该请求。但是, 如果池中的进程数量已经达到指定的最大值, 那么该请求就要等待, 直到池中有进程结束工作之后, 才会重新创建一个新进程去执行。关于常用函数的详细解析, 我们专门针对 .Pool 这个部分进行了整理。采用不阻塞的操作方式去执行函数func, 这种做法允许并发运行, 这意味着不需要死板地等候前一个任务结束才能启动下一个任务, 同时可以指定由args提供的位置参数序列以及用kwds提供的关键字参数集合。applyfunc函数, 它会通过使用阻塞方式, 来实现对func函数的调用。close()关闭Pool使其不再接受新的任务(): 不管这一项任务最终完成了没有, 必须马上就要停止工作。join这个方法的作用是, 会让主进程处于阻塞的状态, 也就是会停下来等待子进程退出, 它必须在close方法执行之后或者在同一个阶段才能够使用。Queue 进程间通信在这两者之间存在通信需求时, 操作系统为达成这一目标提供了丰富多样的技术手段与机制。可以选用模块里边的队列功能来促成多个进程间的交换动作, 而所说的队列这东西自身, 它就属于是一种负责传递消息列队程序的特定工具。可以利用里面存在的那个队列模块, 来执行创建一个消息队列这个动作。q等于一个Queue对象, 括号里面的num这个参数表示要创建的消息的数量是多少, 如果括号里面没有指定最大可以接收的消息数量, 或者那个数量是个负值, 那么就会代表可接收的消息数量没有上限一直可以到内存的尽头。Queue.qsize()返回当前队列包含的消息数量Queue.empty()如果队列为空返回True反之False 如果该队列已经处于了满的状态, 就会返回真值, 而如果它没有满的话, 就返回假值。Queue.get()的意思是取出队列里面的一条消息, 并且把这条消息从队列里面删掉, block这个参数的默认值是True。1要是block这个选项用的是默认值, 而且没有设置具体的时间间隔单位是秒, 那么在消息列队里已经没有剩余的空间可以写入东西的时候, 程序就会被堵住, 也就是停在了等待写入的状态, 一直要等到从消息列队里面腾出足够的空间来才会继续往下走但是如果给block设置了数值, 那么它就在原地等上规定好的那些秒数, 要是等完了以后还是没有空出来的地方, 就会直接抛出一个叫作Queue.Full的异常出来。2如果block这个值等于False的话, 消息队列如果没有空间可以进行写入的话, 那么就会立刻抛出“Queue.Full”这样一个异常情况出来。这玩意儿相当于Queue.get(False), 说白了就是直接取值, 不阻塞。Queue.put(item,)将item消息写⼊队列block默认值 为True在进程池里面使用的, 那种叫做队列的数据结构。如果要想使用Pool来创建进程的话, 那么就一定得需要去借助那个括号里面的Queue函数, 而不能直接用那个普通的Queue函数。上面两张图表所展示的运行结果, 全部都呈现成了以下这种状态。