"

一、模块介绍

  1. multiprocess模快

    仔细说来,multiprocess不是一个模块,而是python中的一个操作、管理进程的包,之所以叫multi是取自multiple的多功能的意思,这个包中几乎包含了和进程有关的所有子模块。

  2. multiprocess.Process模块

    Process能够帮助我们创建子进程,以及对子进程的一些控制.

  • 参数:def __init__(self, group=None, target=None, name=None, args=(), kwargs={}):

group=None:该参数未使用,值始终为None

target:指定要调用的函数,即子进程要执行的任务

args:指定被调用对象的位置参数,以元组的形式传入,必须有逗号,如:args=('a',);此参数在源码中定义的只接收元组,但由于tuple数据类型底层原理的原因,此参数是可以传入一切可迭代对象,如:列表、字典、字符串、生成器表达式等

kwargs:指定被调用对象关键字参数,以字典的形式传入,关键字作为键,参数作为值

name:指定子进程的名称,默认名称为:Process-1、Process-2、...

  • 方法

obj.start():启动子进程,并调用run()方法

obj.run():启动子进程时自动被调用,正是它去调用target参数指定的函数,自定义类中必须实现此方法

obj.terminate():强制终止子进程,不会进行任何清理操作,事实上是让操作系统去终止子进程;而操作系统终止进程是有一个过程的,所以子进程不会立即被终止;使用此方法需谨慎以下两种情况:1. 如果子进程中创建了子子进程,强制终止子进程后,子子进程将变成僵尸进程. 2. 如果子进程保存了一个锁,强制终止后,内存将不会被释放,进而导致死锁

obj.is_alive():判断子进程是否存活,若存活返回True,否则False

obj.join(timeout=None):阻塞父进程,等待子进程终止后再继续执行父进程,timeout指定等待超时时间;此方法只能用于使用start方法启动的子进程,对run方法启动的子进程无效

  • 属性

obj.daemon:默认值为False,如果设为True,子进程将成为守护进程,此属性必须写在start()的前面;守护进程无法创建子进程,且会随着父进程的终止而终止

obj.name:返回子进程的名称

obj.pid:返回子进程的pid

obj.exitcode:子进程在运行时为None,如果为-N,则表示被信号N结束了

obj.authkey:子进程的身份验证键,默认由os.urandom()随机成生成的32bytes;是为涉及网络连接的底层进程间通讯提供安全性,这类连接只有在具有相同身份验证键时才能成功


二、使用Process创建进程

  • windows系统使用Process模块需注意

    由于windows操作系统中没有fork(Linux操作系统中创建进程的机制),因此启动子进程时采用的是导入启动子进程的文件的方式来完成进程间的数据共享。而导入文件即等于执行文件,因此如果将process()直接写在文件中将会无限递归子进程而报错,所以必须把创建子进程的部分使用if __name__ == '__main__':判断保护起来,以防止递归.

1. 基本操作


  1. # 创建单个子进程及对子进程简单的控制
  2. from multiprocessing import Process
  3. from time import sleep
  4. import os
  5. def func(par):
  6. print("%s, PID: %s" %(par, os.getpid()))
  7. print("子进程终止后才继续执行父进程")
  8. sleep(5)
  9. if __name__ == '__main__':
  10. p = Process(target=func, args=("子进程",)) # 实例化一个子进程对象p
  11. # p.run() # run方法启动的子进程免疫join方法
  12. p.start() # 子进程进入就绪状态,等待操作系统调度
  13. print(p.is_alive()) # True: 子进程存活
  14. p.join(1) # 阻塞父进程,等待子进程终止,等待超时时间1s
  15. print(p.is_alive()) # False: 子进程终止
  16. print("父进程, PID: %s" % os.getpid())

  1. # 创建多个子进程
  2. from multiprocessing import Process
  3. from time import sleep
  4. def func(n):
  5. print("子进程", n)
  6. sleep(0.1)
  7. if __name__ == '__main__':
  8. p_lst = []
  9. for i in range(5): # 通过for循环启动多个子进程
  10. p = Process(target=func, args=(i,))
  11. p.start()
  12. p_lst.append(p)
  13. [p.join() for p in p_lst] # 阻塞父进程,等待所有子进程终止
  14. print("父进程")

2. 自定义多进程类


  1. # 自定义多进程类
  2. from multiprocessing import Process
  3. from time import sleep
  4. class MyProcess(Process):
  5. def __init__(self, target, name, sex):
  6. self.sex = sex
  7. super(MyProcess, self).__init__(target=target, name=name)
  8. # self.name = name
  9. # 父类Process初始化时会自动定义name属性,所以定义本类的name属性要写到super语句后面,
  10. # 否则会被父类初始化时覆盖掉(MyProcess-子进程序号),或者给父类传参__init__(name=name)
  11. def run(self): # 必写方法,用于调用函数
  12. print("子进程:", self.name)
  13. super(MyProcess, self).run()
  14. func = lambda :print("执行了函数")
  15. # 如果是Windows系统,此处要写一条__main__判断语句
  16. p = MyProcess(func, 'zyk', 'boy')
  17. p.start()
  18. # p.run() # start方法会自动调用此方法

3.进程之间的数据共享与隔离


  1. # 进程之间的数据共享与隔离
  2. from multiprocessing import Process, Value
  3. def func():
  4. global n # !
  5. n = 2 # 数据隔离:不会影响父进程中的变量n
  6. print("子进程n: ", n) # 2
  7. s.value = 4 # 数据共享:会影响父进程中的s
  8. print("子进程s: ", s.value)
  9. if __name__ == '__main__':
  10. n = 1
  11. s = Value('i', 3)
  12. p = Process(target=func)
  13. p.start()
  14. p.join()
  15. print("父进程n: ", n) # 1
  16. print("父进程s: ", s.value) # 4

4.守护进程


  1. # 守护进程
  2. from multiprocessing import Process
  3. from os import getpid
  4. class MyProcess(Process):
  5. def __init__(self, name):
  6. super(MyProcess, self).__init__()
  7. self.name = name
  8. def run(self):
  9. print(self.name, getpid())
  10. # 父进程是先进入就绪状态的,所以父进程一般会先终止(除非父进程还有很长的逻辑要走)
  11. # 子进程可能还未打印信息便随父进程终止而终止了,
  12. p = MyProcess('zyk')
  13. p.daemon = True # 确认为守护进程,随父进程终止而终止
  14. p.start()
  15. # p.join() # 阻塞父进程,方可正常执行完子进程,而显示打印信息
  16. print("父进程")

5.进阶:socket消息加并发实例


  1. # Server
  2. from multiprocessing import Process
  3. from socket import *
  4. server = socket(AF_INET, SOCK_STREAM)
  5. server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
  6. server.bind(('127.0.0.1', 8080))
  7. server.listen(5)
  8. def talk(conn, client_addr):
  9. while True:
  10. try:
  11. msg = conn.recv(1472)
  12. if not msg:break
  13. conn.send(msg.upper())
  14. except Exception:
  15. break
  16. if __name__ == '__main__':
  17. while 1:
  18. conn, client_addr = server.accept()
  19. p = Process(target=talk, args=(conn, client_addr))
  20. p.start()
  21. print(p.name)

  1. # Client
  2. import socket
  3. client = socket.socket()
  4. client.connect_ex(('127.0.0.1', 8080))
  5. while 1:
  6. msg = input('>>>').strip()
  7. if not msg:continue
  8. client.send(msg.encode('utf-8'))
  9. msg = client.recv(1472)
  10. print(msg.decode('utf-8'))

完结

"

【Python 多进程】的更多相关文章

  1. Python多进程编程

    转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...

  2. Python多进程(1)——subprocess与Popen()

    Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技 ...

  3. Python多进程使用

    [Python之旅]第六篇(六):Python多进程使用   香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比, ...

  4. python多进程断点续传分片下载器

    python多进程断点续传分片下载器 标签:python 下载器 多进程 因为爬虫要用到下载器,但是直接用urllib下载很慢,所以找了很久终于找到一个让我欣喜的下载器.他能够断点续传分片下载,极大提 ...

  5. Python多进程multiprocessing使用示例

    mutilprocess简介 像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的利用率会比threading好的多. import multipr ...

  6. Python多进程并发(multiprocessing)用法实例详解

    http://www.jb51.net/article/67116.htm 本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Pyt ...

  7. python 多进程开发与多线程开发

    转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文:  博文1  博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...

  8. Python多进程----从入门到放弃

    Python多进程 (所有只写如何起多进程跑数据,多进程数据汇总处理不提的都是耍流氓,恩,就这么任性) (1)进程间数据问题,因为多进程是完全copy出的子进程,具有独立的单元,数据存储就是问题了 ( ...

  9. day-4 python多进程编程知识点汇总

    1. python多进程简介 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心.Python提供了非常好用的多进程包multiprocessing,他提供了一 ...

  10. python 多进程 logging:ConcurrentLogHandler

    python 多进程 logging:ConcurrentLogHandler python的logging模块RotatingFileHandler仅仅是线程安全的,如果多进程多线程使用,推荐 Co ...

随机推荐

  1. Java开发新闻管理系统(前后端)+爬虫百度、新浪等新闻

                  ForFuture News  新闻管理系统                      项目演示地址:http://www.ganquanzhong.top [注]:文档下 ...

  2. Unity 坐标系转换

    在Unity中我们通常会用到以下几个坐标系下的点: 世界坐标系:World Space 简单来讲,我们通过 transform.position | transform.rotation 获取得到的位 ...

  3. Hibernate的基本工作原理

    Hibernate开发过程中会用到5个核心接口: 1.Configuration2.SessionFactory3.Session4.Transaction5.QueryHibernate就是通过这些 ...

  4. adb 无线连接手机设备

    连接语法: $ adb connect ip:port 断开连接: $ adb disconnect ip:port 可能遇到问题:unable to connect to 192.168.199.2 ...

  5. LitElement(五)事件

    1.概述 1.1 在何处添加事件监听器 您需要以一种可以在事件发生之前触发的方法添加事件监听器.但是,为了获得最佳的加载性能,应尽可能晚添加事件监听器. 你可以在以下位置添加事件监听器: 1.1.1  ...

  6. C#常见几种集合比较

    1. ArrayList 1.1 ArrayList是一个特殊数组,通过添加和删除元素就可以动态改变数组的长度. ArrayList集合相对于数组的优点:支持自动改变大小,可以灵活的插入元素,可以灵活 ...

  7. MySQL学习(十一)double write 介绍 (半原创)

    复习 Innodb关键的特性 插入缓存 两次写 异步IO 刷新邻近页 自适应哈希索引 概述 double write 的主要的作用是保证写入数据库文件的可靠性.通俗地说就是一份数据写两个地方,当出现异 ...

  8. HTML5学习(1)简介

    HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定. HTML5的设计目的是为了在移动设备上支持多媒体. HTML5 简单易学. 什么是 HTML5? HTML5 ...

  9. html滑动

    $('html, body').animate({scrollTop: 1500}, 'fast');

  10. 力扣MYSQL练习

    176编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . select IFNULL((SELECT distinct salary from employee or ...