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

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. adb shell提示“adb server is out of date.” 解决方法

    [问题描述] 1.打开运行:window+R,输入cmd回车 2.使用命令 adb shell 无法登录安卓设备,提示如下: adb server is out of date.  killing.. ...

  2. 实战接口开发:python + flask + mysql + redis(根据反馈,持续细化更新。。。)

    前言 自动化已经成为测试的必备技能之一了,所以,很多想跳槽的测试朋友都在自学,特别是最实用的接口自动化, 但是很多人因为没有可以练手的项目而苦恼,最终导致缺乏实战经验,其实,完全可以自己开发个简单项目 ...

  3. jmeter,学这些重点就可以了

    前言 对测试来说,jmeter应该是大家使用较频繁的测试工具之一,因为其开源.免费.轻量.功能强大,支持很多种协议,除了测功能,还能做自动化和性能测试: 据某机构的调查,性能并发工具中,jmeter市 ...

  4. Mybatis-Plus Bugs

    Mybatis-Plus Bugs 实体类中属性和数据库字段对应异常 Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'user ...

  5. JDOJ 1929: 求最长不下降序列长度

    JDOJ 1929: 求最长不下降序列长度 JDOJ传送门 Description 设有一个正整数的序列:b1,b2,-,bn,对于下标i1<i2<-<im,若有bi1≤bi2≤-≤ ...

  6. C++中#define与typedefine的区别

    原文链接:https://www.cnblogs.com/fengfengqingqingyangyang/p/3270432.html (1)typedef是用来定义关键字/标识符的别名,并未分配内 ...

  7. Python进阶-VI 生成器函数进阶、生成器表达式、推导式

    一.生成器函数进阶 需求:求取移动平均数 1.应用场景之一,在奥运会气枪射击比赛中,每打完一发都会显示平均环数! def show_avg(): print('你已进入显示移动平均环数系统!') a ...

  8. PATB1033 旧键盘打字 (20 分)

    一.技术总结 使用字符数组出现段错误即char str[];改成string str:后问题解决.以后尽量使用C++中的string 使用cin>>,出现答案错误,原因可能是在输入是有空格 ...

  9. Linux性能优化实战学习笔记:第四十讲

    一.上节回顾 上一节,我们学习了碰到分布式拒绝服务(DDoS)的缓解方法.简单回顾一下,DDoS利用大量的伪造请求,导致目标服务要耗费大量资源,来处理这些无效请求,进而无法正常响应正常用户的请求. 由 ...

  10. 树形DP(超详细!!!)

    一.概念 1.什么是树型动态规划 树型动态规划就是在“树”的数据结构上的动态规划,平时作的动态规划都是线性的或者是建立在图上的,线性的动态规划有二种方向既向前和向后,相应的线性的动态规划有二种方法既顺 ...