multiprocessing模块为在子进程中运行任务、通信和共享数据,以及执行各种形式的同步提供支持。进程没有任何共享状态,如果某个进程修改数据,改动只限于该进程内。

Process()类:表示运行在一个子进程中的任务。

class Process(object):
def init(self, group=None, target=None, name=None, args=(), kwargs={}):

参数:

group:未使用

target:当前进程启动时执行的可调用对象

name:为进程指定描述性名称的字符串

args:传递给target的位置参数的元组

kwargs:传递给target的关键字参数的字典

实例p有以下方法和属性:


'authkey','daemon', 'exitcode', 'ident', 'is_alive', 'join', 'name', 'pid', 'run', 'sentinel', 'start', 'terminate'

方法

1.p.is_alive():如果p仍然运行,返回True

2.p.join():等待进程p终止。timeout是可选的超市期限。进程可以被连接无数次,但如果连接自身则会出错。

3.p.run():进程启动时运行的方法。默认情况下,会调用传递给Process构造函数的target。定义进程的另一个方法是继承Process类并重新实现run()函数。

4.p.start():启动进程。这将运行代表进程的子进程,并调用该子进程中的p.run()函数

5.p.terminate():强制终止进程。如果调用此函数,进程P将被立即终止,同时不会进行任何清理动作。如果进程p创建了它自己的子进程,这些进程将变为僵尸进程。使用此方法时需特别小心。如果p保存了一个锁或参与了进程间通信,那么终止它可能会导致死锁或I/O损坏。

属性

6.p.authkey:进程的身份验证键。除非显式设定,这是由os. urandom()函数生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性。这类连接只有在两端具有相同的身份验证键时才能成功。

7.p.daemon:

一个布尔标志,指示进程是否是后台进程。当创建它的 Python进程终止时,后台( Daemonic)进程将自动终止。另外,禁止后台进程创建自己的新进程。p.daemon的值必须在使用 p.start()函数启动进程之前进行设置。

8.p.exitcode:进程的整数退出代码。如果进程仍然在运行,它的值为None。如果值为负数,-N表示进程由信号N所终止。

9.p.name:进程的名称。

10.p.pid:进程的整数进程ID。

11.p.ident:

12.p.sentinel:

  • 例子:demo3.py

进程间通信

  • multiprocessing模块支持进程间通信的两种主要形式:管道和队列。这两种方法都是使用消息传递实现的,但队列接口有意模仿线程程序中常见的队列用法。

队列

Queue( [maxsize])


class Queue(object):def __init__(self, maxsize=-1):self._maxsize = maxsize
  • 创建共享的进程队列。 maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底

层队列使用管道和锁实现。另外,还需要运行攴持线程以便将队列中的数据传输到底层管道中

  • Queue的实例q具有以下方法:

'cancel_join_thread', 'close', 'empty', 'full', 'get', 'get_nowait', 'join_thread', 'put', 'put_nowait', 'qsize'
  1. q.cancel_join_thread():

  2. q.close():

  3. q.empty():

  4. q.full():

  5. q.get():

  6. q.get_nowait():

  7. q.join_thread():

  8. q.put():

  9. q.put_nowait():

  10. q.qsize():

JoinableQueue([maxsize])

  • 创建可连接的共享进程队列。这就像是一个Queue对象,但队列允许项的消费者通知生产者项已经被成功处理。通知进程是使用共享的信号和条件变量来实现的。

  • JoinableQueue的实例p除了与 Queue对象相同的方法之外,还具有以下方法:


'cancel_join_thread', 'close', 'empty', 'full', 'get', 'get_nowait', 'join', 'join_thread', 'put', 'put_nowait', 'qsize', 'task_done'
  1. p.task_done():消费者使用此方法发出信号,表示qget()返回的项已经被处理。如果调用此方法的次数大于从队列中删除的项的数量,将引发 Valueerror异常。

  2. p.join():生产者使用此方法进行阻塞,直到队列中的所有项均被处理。阻塞将持续到为队列中的每个项均调用q.task done()方法为止。

  • 例子:demo4.py

管道

Pip([duplex])

在进程之间创建一条管道,并返回元组(conn1,conn2),其中conn和conn2是表示管道两端的 Connection对象。默认情况下,管道是双向的。如果将 duplex置为 False,conn只能用于接收,而con2只能用于发送。必须在创建和启动使用管道的 Process对象之前调用pipe()方法。


def Pipe(duplex=True):return Connection(), Connection()

Pipe()方法返回的 Connection对象的实例c具有以下方法和属性。

  1. c.close():关闭连接。如果c被垃圾回收,将自动调用此方法。

  2. c.fileno():返回连接使用的整数文件描述符。

  3. c.poll([timeout]):如果连接上的数据可用,返回True。timeout指定等待的最长时限。如果省略此参数,方法将立即返回结果。如果将 timeout置为None,操作将无限期地等待数据到达。

  4. c.recv():接收c.send()方法返回的对象。如果连接的另一端已经关闭,再也不存在任何数据,将引发EOFERror异常。

  5. c.recv_bytes([maxlength]):

接受c.send_ bytes()方法发送的一条完整的字节消息。 maxlength指定要接收的最大字节数。如果进入的消息超过了这个最大值,将引发 IOError异常,并且在连接上无法进行进一步读取。如果连接的另一端已经关闭,再也不存在任何数据,将引EOFERror异常。

  1. c.recv_bytes_into(buffer [ offset]):接收一条完整的字节消息,并把它保存在 buffer对象中,该对象支持可写入的缓冲区接口(即bytearray对象或类似的对象)。offset指定缓冲区中放置消息处的字节位移。返回值是收到的字节数。如果消息长度大于可用的缓冲区空间,将引发 BufferTooShort异常。

  2. c.send(obj):通过连接发送对象。obj是与序列化兼容的任意对象

  3. C.send_bytes(buffer [,offset [,size]]):通过连接发送字节数据缓冲区。 buffer是支持缓冲区接口的任意对象, offset是缓冲区中的字

节偏移量,而size是要发送字节数。结果数据以单条消息的形式发出,然后调用c.recv_bytes()函数进行接收。

如何使用管道实现前面的生产者-消费者问题


# import multiprocessing# def consumer(output_p,input_p):# input_p.close()# while True:# try:# item = output_p.recv()# except EOFError:# break# print(item)# print("Consumer done")### def producer(sequence,input_P):# for item in sequence:# input_P.send(item)### if __name__ == '__main__':# (output_p,input_p) = multiprocessing.Pipe()# cons_p = multiprocessing.Process(target=consumer,args=(output_p,input_p),)# cons_p.start()### output_p.close()## sequence = [1,2,3,4]# producer(sequence,input_p)# input_p.close()## cons_p.join()

管道可用于双向通信。利用通常在客户端/服务器计算中使用的请求响应模型或远程过程调用,就可以使用管道编写与进程交互的程序,例如:


import multiprocessingdef add(pipe):server_P, client_P = pipeclient_P.close()while True:try:x,y = server_P.recv()except EOFError:breakresult = x + yserver_P.send(result)print("Server done")if __name__ == '__main__':(server_P, client_P) = multiprocessing.Pipe()adder_p = multiprocessing.Process(target=add,args=((server_P, client_P),))adder_p.start()server_P.close()client_P.send((3,4))print(client_P.recv())client_P.send(('hello','world'))print(client_P.recv())client_P.close()adder_p.join()
  • 如何使用管道实现前面的生产者-消费者问题这个例子中有一个错误:

output_p, input_p= pipe

传进来的只有一个参数却赋值给两个参数。

转载于:https://www.cnblogs.com/lalavender/p/10744888.html

multiprocessing模块相关推荐

  1. python multiprocessing模块

    python multiprocessing模块 原文地址 multiprocessing multiprocessing支持子进程.通信和共享数据.执行不同形式的同步,提供了Process.Queu ...

  2. 进程初识和multiprocessing模块之Process

    一.什么是进程 进程就是运行中的程序进程是操作系统中最小的资源分配单位进程与进程之间的关系 : 数据隔离的进程的id:Process id = pid pid是一个全系统唯一的对某个进程的标识,随着这 ...

  3. Day28:Event对象、队列、multiprocessing模块

    一.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测.如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就 会变得非常棘手.为了解决这些问题, ...

  4. python 多线程 模块_Python多线程threading和multiprocessing模块实例解析

    本文研究的主要是Python多线程threading和multiprocessing模块的相关内容,具体介绍如下. 线程是一个进程的实体,是由表示程序运行状态的寄存器(如程序计数器.栈指针)以及堆栈组 ...

  5. Python进程学习笔记-multiprocessing模块

    如果你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择.由于Windows没有fork调用,难道在Windows上无法用Python编写多进程的程序? 由于Python是跨平台的,自然也 ...

  6. python如何关闭multiprocess_python 开启进程两种方法 multiprocessing模块 介绍

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进 ...

  7. 进程与multiprocessing模块

    一 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在 ...

  8. python 多进程 调用模块内函数_进程创建fork()和multiprocessing模块Process类

    一.进程VS程序 一个人穿上军装去打仗就是战士,战士需要武器.战场等资源.一个人去种田就是农民,农民需要土地.锄头等资源. 编写完毕的代码,安静的呆在磁盘上,称之为程序.代码要运行就得加载到内存,正在 ...

  9. python multiprocessing_Python的multiprocessing模块详解

    通过multiprocessing模块的Process类创建一个进程的实力,并通过run()的方法来运行他from multiprocessing import Process import os d ...

  10. Python 多进程并行编程实践: multiprocessing 模块

    转载:http://python.jobbole.com/87645/ 前言 并行计算是使用并行计算机来减少单个计算问题所需要的时间,我们可以通过利用编程语言显式的说明计算中的不同部分如何再不同的处理 ...

最新文章

  1. 六 运行级别调整增加启动项
  2. 数据科学竞赛-自然语言处理赛流程
  3. 京东上市了,员工有多少股票? .
  4. Hadoop 基础系列一Hadoop 系列之 1.0 和2.0 架构
  5. sklearn一般流程
  6. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】
  7. bottleneck resnet网络_Detection学习之四-利用pytorch实现resnet
  8. @RequestParam使用须知
  9. 长虹电视刷机固件包汇总
  10. 深度学习CUDA最新最佳安装教程
  11. 基于深度学习时间序列分类研究综述[论文阅读]
  12. SQL注入(基于 tryhackme 的讲解)
  13. SPA项目开发(首页导航左侧菜单)
  14. 字节跳动校招提前批面试
  15. 微信小程序获取WIFI列表可手动输入密码连接
  16. The VPN client agent was unable to create the interprocess communication depot.关于win10安装vpn报错的问题
  17. 登陆mysql的命令行
  18. 掩码认证消息(MAM)详细介绍
  19. 深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
  20. Abaqus流固耦合分析

热门文章

  1. JDK windows加载字体文件的函数
  2. 管理新语:新员工进来,竟然连起码的技能培训都没有
  3. 2021-0409梦笔记
  4. 解决TortoiseGit文件夹和文件状态图标不显示问题
  5. 怀念的不是初恋,是那段时光
  6. 雄伟到惊世骇俗的黄羊山超级相控阵雷达
  7. python字符串实例_python 字符串内置方法实例
  8. 微型计算机系统三层结构,微型计算机系统结构图.doc
  9. 广西高中有没有计算机课程,广西普通高中学业水平考试信息技术学科-广西招生考试院.doc...
  10. java项目关联关系_Mybatis一对多关联关系映射实现过程解析