python提供了一个跨平台的多进程支持——multiprocessing模块,其包含Process类来代表一个进程对象

  1、Process语法结构:(注: 传参的时候一定使用关键字传参)

2、自定义进程类:需要继承Process类
       自定义类的时候必须注意的事项:
            第一,必须继承Process类的构造方法
            第二,必须重写Process类的run()方法
            第三,不能用实例化对象直接调用run()方法,而是调用start()方法
            第四,在进程改变实例化对象的数据时,这个数据是被隔离的,即改变数据不成功
# 自定义进程类
class ProcessClass(Process):
g_num = 100 def __init__(self, interval):
# 这行代码必须添加上
super().__init__()
self.interval = interval
self.result = "初始化" def run(self):
global g_num
g_num = 120
print("子进程{},开始执行,父进程为{}".format(os.getpid(), os.getppid()))
start = time.time()
time.sleep(2)
stop = time.time()
print("{}执行结束,耗时{:0.2f}秒".format(os.getpid(), stop-start))
self.result = "运行之后的结果" if __name__ == "__main__":
t_start = time.time()
print("当前进程{}".format(os.getpid()))
p = ProcessClass(2)
p.start()
p.join()
t_stop = time.time()
# 数据隔离
print("子进程 任务 运行结果:", p.result) # -----> 初始化 数据未改变
print(ProcessClass.g_num) # ------>100 数据未改变
print("(%s)执行结束,耗时%0.2f" % (os.getpid(), t_stop - t_start))
  3、进程间的通信
            像之前改变数据,就要使用到进程间的通信,可以使用multiprocessing模块的Queue类来实现进程间的通信
            Queue的常用方法:
                 qsize(): 返回当前队列包含的消息(数据)数量
                 empty():如果队列为空,返回True,否则False
                 full():如果队列满了,返回True,否则False
                 get() 或者 put()分别时阻塞式获取 或者 阻塞式存储队列的一条消息(数据),然后获取 或者 添加这条消息,如果队列为空 或者 队列满了,在运行的过程阻塞
                 get_nowait() 或者 put_nowait()分别时非阻塞式获取 或者 非阻塞式存储队列的一条消息(数据),然后移除 和 添加这条消息,如果队列为空 或者 队列满了,会抛出相应的异常

    实例如下:

# 自定义进程类
class ProcessClass(Process):
g_num = 100 def __init__(self, interval, q):
# 这行代码必须添加上
super().__init__()
self.interval = interval
self.result = "初始化"
# 初始化一个队列实例化对象
self.q = q def run(self):
global g_num
g_num = 120
print("子进程{},开始执行,父进程为{}".format(os.getpid(), os.getppid()))
start = time.time()
time.sleep(self.interval)
stop = time.time()
print("{}执行结束,耗时{:0.2f}秒".format(os.getpid(), stop-start))
self.result = "运行之后的结果"
# 将消息(数据)添加到队列中
self.q.put(g_num)
self.q.put(self.result) def get_data(self):
return self.result if __name__ == "__main__":
# 初始化一个队列实例化对象,参数为队列的长度
queues = Queue(5)
print("当前进程{}".format(os.getpid()))
p = ProcessClass(2, queues)
t_start = time.time()
p.start()
p.join()
t_stop = time.time()
# 数据隔离
print("子进程 任务 运行结果:", p.get_data()) # -----> 初始化 数据未改变
print(ProcessClass.g_num) # ------>100 数据未改变
print("子进程 任务 运行结果:", queues.get()) # -----> 120 数据未改变
print("子进程 任务 运行结果:", queues.get()) # -----> 运行之后的结果 数据未改变
print("(%s)执行结束,耗时%0.2f" % (os.getpid(), t_stop - t_start))
 
4、进程池:
          如果进程有成千上万个,手动创建进程的工作量巨大,这个时候应该用到multiprocessing模块中的Pool类
          这个类下有几个方法比较常用:
          apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行 ,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给 func的参数列表,kwds为传递给func的关键字参数列表;
          apply(func[, args[, kwds]]):使用阻塞方式调用func  close():关闭Pool,使其不再接受新的任务; 
           terminate():不管任务是否完成,立即终止;
          join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用
主要实例:
# 进程池
def worker(msg):
start = time.time()
print("{}开始执行,进程号为{}".format(msg, os.getpid()))
# random.random()生成0~1之间的随机数
time.sleep(random.random()*3)
# time.sleep(3)
stop = time.time()
print(msg, "执行完毕,耗时{:.2f}".format(stop-start)) if __name__ == "__main__":
# 定义一个进程池,最大数为3
po = Pool(3)
for i in range(10):
# 非阻塞式操作Pool.apply_async(要调用的目标,(传递给目标的参数元组,))
# 每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker, (i, ))
# 阻塞式操作
# po.apply(worker, (i, ))
print("start".center(24, "-"))
po.close()
po.join()
print("end".center(24, "-"))

python高级编程——进程和进程池的更多相关文章

  1. python高级编程——线程和线程池

    线程模块           线程的特点:                本质上是异步的.需要多个并发活动.每个活动的处理顺序可能是不确定的.或者说是随机的,不可预测的,宏观上是同时运行的       ...

  2. 第十章:Python高级编程-多线程、多进程和线程池编程

    第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...

  3. (六) 一起学 Unix 环境高级编程 (APUE) 之 进程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  7. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

  8. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  9. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  10. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

随机推荐

  1. 使用VS进入源码调试

    我的使用的是Visual Studio 2019 原因 学习完一部分东西后,我发现了一个更牛b的东西ABP框架. 所以开始学习ABP框架 https://github.com/aspnetboiler ...

  2. c++-构造函数练习和delete,new

    强化练习 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostr ...

  3. Java面试题_第二阶段(Servlet、HTTP、Session、JSP、 Ajax、Filter、JDBC、Mysql、Spring)

    1.1. 描述Servlet调用过程? 答案: (1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址. (2)浏览器根据 ...

  4. Python 下JSON的两种编解码方式实例解析

    概念   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写.在日常的工作中,应用范围极其广泛.这里就介绍python下它的两种编解码方法: ...

  5. js 从两道面试题加深理解闭包与箭头函数中的this

     壹 ❀ 引 在本文之前我已经花了两个篇幅专门介绍了JavaScript中的闭包与this,正好今早地铁上看到了两道面试题,试着做了下发现挺有意思,所以想单独写一篇文章来记录解析过程.若你对于闭包与t ...

  6. js 日期格式化小问题

    看一个图 toLocaleString 的格式是 yyyy/MM/d , 想要 yyyy/MM/dd, toISOString 的格式基本满足, 本想直接 split("T"),  ...

  7. Eureka+SpringBoot2.X版本实现优雅停服

    在客户端添加如下配置 pom依赖 actuator.jar包 <dependency> <groupId>org.springframework.cloud</group ...

  8. GC与内存分配策略

    一.GC 第一步:判断对象是否已死?有两种方法:第一种是引用计数法,即给对象添加一个引用计数器,当被引用时,计数器就+1:当引用失效时,就-1:当计数器为0时,代表对象没有被引用.但是计数器的缺点就是 ...

  9. Chilkat9.5.0.75(x86+x64)ActiveX+注册机

    链接:https://pan.baidu.com/s/1GiUnlcRX1pLDiF6yVnBnVQ  密码:ivfv

  10. Android8.1 SystemUI源码分析之 Notification流程

    代码流程 1.先看UI显示,StatuBar加载 CollapsedStatusBarFragment 替换 status_bar_container(状态栏通知显示区域) SystemUI\src\ ...