进程:通俗理解一个运行的程序或者软件,进程是操作系统资源分配的基本单位

1.1、导入进程模块
import multiprocessing

1.2、Process进程类的语法结构如下:

Process([group[, target[, name[,args[,kwargs]]]]])

group: --指定进程组,目前只能使用None
target: --执行的目标任务名
name: --进程名字
args: --以元组方式给执行任务传参
kwargs: --以字典方式给执行任务传参

Process创建 的实例对象的常用方法:

start(), 启动子进程实例(创建子进程)
join(timeout), 是否等待子进程执行结束,或等待多少秒
terminate(), 不管任务是否完成,立即终止进程

Process创建的实例对象的常用属性:

name 当前进程的别名,默认为Process-N,N为从1开始递增的整数。
pid 当前进程的pid(进程号)

一、多进程完成多任务代码

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
python进程
"""
import multiprocessing
import time def run_proc():
"""
子进程要执行的代码
:return:
"""
while True:
print("---2---")
time.sleep(1) if __name__ == "__main__":
#创建子进程
sub_process = multiprocessing.Process(target=run_proc)
#启动子进程
sub_process.start()
while True:
print("----1----")
time.sleep(1)

代码执行结果:

二、获取进程pid

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
获取进程pid
""" import multiprocessing
import time
import os def work():
#查看当前进程
current_process = multiprocessing.current_process()
print("work:", current_process)
#获取当前进程的编号
print("work进程编号:", current_process.pid, os.getpid())
#获取父进程的编号
print("work父进程的编号:", os.getppid())
for i in range(10):
print("工作中....")
time.sleep(0.2)
#扩展,根据进程编号杀死对应的进程
os.kill(os.getpid(), 9) if __name__ == "__main__":
#查看当前进程
current_process = multiprocessing.current_process()
print("main:", current_process)
#获取当前里程的编号
print("main进程的编号:", current_process.pid) #创建子进程
sub_process = multiprocessing.Process(target=work)
#启动进程
sub_process.start() #主进程执行打印信息操作
for i in range(5):
print("我在主进程中执行....")
time.sleep(0.2)

代码执行结果:

三、进程的基本状态及状态之间的关系

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
给子进程指定的函数传递参数
""" import multiprocessing #定义一个用于显示信息的方法
def show_info(name, age):
print("name:", name, "; age:", age) if __name__ == "__main__":
sub_process = multiprocessing.Process(target=show_info, args=("yusheng_liang", 20))
#启动进程
sub_process.start()

代码执行结果:

四、进程之间不共享全局变量

注意:创建子进程其实是对主进程进行拷贝,进程之间相互独立,访问的全局变量不是同一个,所以进程之间不共享全局变量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
进程之间不共享全局变量
"""
import multiprocessing
import time #定义全局变量
my_list = list() #定义写入数据的方法
def write_data():
for i in range(5):
my_list.append(i)
time.sleep(0.2)
print("write_data: ", my_list) #定义读取数据的方法
def read_data():
print("read_data: ", my_list) if __name__ == "__main__":
#创建写入数据的进程
write_process = multiprocessing.Process(target=write_data)
#创建读取数据的进程
read_process = multiprocessing.Process(target=read_data) write_process.start() #主进程等待写入进程执行完成以后代码,再继续往下执行
write_process.join()
read_process.start()

代码执行结果:

五、主进程会等待所有的子进程执行完成程序再退出

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
主进程会等待所有的子进程执行完成程序再退出
"""
import multiprocessing
import time #测试子进程是否执行完成以后主进程才能退出
def work():
for i in range(7):
print("工作中.....")
time.sleep(0.2) if __name__ == "__main__":
#创建子进程
work_process = multiprocessing.Process(target=work)
work_process.start() #让主进程等待1秒钟
time.sleep(1)
print("主进程执行完成了啦!!")

代码执行结果:

六、销毁子进程的代码

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
主进程会等待所有的子进程执行完成程序再退出
"""
import multiprocessing
import time #测试子进程是否执行完成以后主进程才能退出
def work():
for i in range(7):
print("工作中.....")
time.sleep(0.2) if __name__ == "__main__":
#创建子进程
work_process = multiprocessing.Process(target=work)
work_process.start() #让主进程等待1秒钟
time.sleep(1)
print("主进程执行完成了啦!!") #让子进程直接销毁,表示终止执行,主进程退出之前,把所有的子进程直接销毁就可以了
work_process.terminate()

代码执行的结果:

六、进程池

1、当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
2、初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

实例一:进程池同步执行任务
  进程池同步执行任务表示进程池中的进程在执行任务的时候一个执行完成另外一个才能执行,如果没有执行完会等待上一个进程执行。

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
进程池同步实例代码
"""
import multiprocessing
import time #复制任务
def work():
print("复制中...", multiprocessing.current_process().pid)
time.sleep(0.5) if __name__ == "__main__":
#创建进程池
#3:进程池中进程的最大个数
pool = multiprocessing.Pool(3)
#模拟大批量的任务,让进程池去执行
for i in range(5):
#循环让进程池执行对应的work任务
#同步执行任务,一个任务执行完成以后另外一个任务才能执行
pool.apply(work)

实例二:进程池异步执行任务
  进程池异步执行任务表示进程池中的进程同时执行任务,进程之间不会等待

 #!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
进程池异步执行任务
进程池会根据任务执行情况自动创建进程,而且尽量少创建进程,合理利用进程池中的进程完成多任务
"""
import multiprocessing
import time #复制任务
def work():
print("复制中...", multiprocessing.current_process().pid)
# 获取当前进程的守护状态
# 提示:使用进程池创建的进程是守护主进程的状态,默认自己通过Process创建的进程是不是守住主进程的状态
# print(multiprocessing.current_process().daemon)
time.sleep(0.5) if __name__ == "__main__":
#创建进程池
pool = multiprocessing.Pool(3)
#模拟大批量的任务,让进程池去执行
for i in range(5):
# 循环让进程池执行对应的work任务
# 同步执行任务,一个任务执行完成以后另外一个任务才能执行
# pool.apply(work)
# 异步执行,任务执行不会等待,多个任务一起执行
pool.apply_async(work)
# 关闭进程池,意思告诉主进程以后不会有新的任务添加进来
pool.close()
# 主进程等待进程池执行完成以后程序再退出
pool.join()

python--进程初识详解的更多相关文章

  1. Python开发技术详解PDF

    Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...

  2. python协程详解

    目录 python协程详解 一.什么是协程 二.了解协程的过程 1.yield工作原理 2.预激协程的装饰器 3.终止协程和异常处理 4.让协程返回值 5.yield from的使用 6.yield ...

  3. 《python开发技术详解》|百度网盘免费下载|Python开发入门篇

    <python开发技术详解>|百度网盘免费下载|Python开发入门篇 提取码:2sby  内容简介 Python是目前最流行的动态脚本语言之一.本书共27章,由浅入深.全面系统地介绍了利 ...

  4. Python 字符串方法详解

    Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息.        ...

  5. python time模块详解

    python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明  一.简介 ...

  6. Python中dict详解

    from:http://www.cnblogs.com/yangyongzhi/archive/2012/09/17/2688326.html Python中dict详解 python3.0以上,pr ...

  7. linux进程地址空间详解(转载)

    linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...

  8. Python开发技术详解(视频+源码+文档)

    Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...

  9. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

  10. 【python进阶】详解元类及其应用2

    前言 在上一篇文章[python进阶]详解元类及其应用1中,我们提到了关于元类的一些前置知识,介绍了类对象,动态创建类,使用type创建类,这一节我们将继续接着上文来讲~~~ 5.使⽤type创建带有 ...

随机推荐

  1. 设计模式小议:state【转】

    转自:https://blog.csdn.net/goodboy1881/article/details/635963 这个模式使得软件可以在不同的state下面呈现出完全不同的特征 不同的theme ...

  2. 当请求进入Nginx后,每个HTTP执行阶段的作用

    阶段顺序 阶段名称 作用 1 NGX_HTTP_POSTREAD_PHASE = 0 接收并读取请求阶段 2 NGX_HTTP_SERVER_REWRITE_PHASE 修改url阶段,通常有重定向和 ...

  3. cocos2dx3.x + xcode7.3 问题“libpng error: CgBI: unhandled critical chunk”

    今天用 cocos2dx3.11.1 + xcode7.3.1 进行开发,新建项目后遇到如下问题: 在iphone(ios9.3.5)真机运行项目(用xcode自带虚拟机没有出现问题) auto sp ...

  4. 201871010104-陈园园 《面向对象程序设计(java)》第十二周学习总结

    201871010104-陈园园 <面向对象程序设计(java)>第十二周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  5. Tkinter 鼠标键盘事件(一)

    一: 鼠标事件 <Button-1>                                                                     鼠标左键单击 ...

  6. COSO企业风险管理框架及其在大宗商品行业的应用

    https://mp.weixin.qq.com/s/P1NDvqsz0GNObm1pb47mfg 中国期货市场交易量领先全球,期权.互换等新的衍生品工具逐步引入,场外衍生品服务商正在涌现.越来越多的 ...

  7. LG3004 「USACO2010DEC」Treasure Chest 区间DP+滚动数组优化

    问题描述 LG3004 题解 把拿走的过程反向,看做添加的过程,于是很显然的区间DP模型. 设\(opt_{i,j}\)代表区间\([i,j]\)中Bessie可以获得的最大值,显然有 \[opt_{ ...

  8. Java基础的容错

    新手会有一些常犯的过失,一般一个新手在学习Java开发的时分,往往会挑选买书去学习,首要这样的学习功率是非常差的,比如在学习html,css的时分,是彻底不必看书的.书里大多数东西你都不了解.这是新手 ...

  9. 2019CCPC网络预选赛 八道签到题题解

    目录 2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 6702 & 6703 array 6704 K-th occurrence 6705 path 6706 huntian o ...

  10. Node.js安装使用-VueCLI安装使用-工程化的Vue.js开发

    作者 | Jeskson 来源 | 达达前端小酒馆 搭建Node.js环境 什么是Node.js简介呢?它是一个基于JavaScript的运行环境,Node.js发布于2009年5月,对Chrome ...