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

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. linux 的 expect 自动交互

    https://www.jianshu.com/p/0194cbd70d39 https://www.cnblogs.com/saneri/p/10819348.html  参考 expect是一个自 ...

  2. Java并发--Java中的CAS操作和实现原理

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/CringKong/article/deta ...

  3. JS高阶---闭包(循环遍历+监听)

    大纲: 主体: (1)场景1:点击按钮显示点击的第几个 注意:伪数组每次循环时都会重新计算一次长度,所以最好提出去或者直接加到for循环内部 结果: 分析: 1.i为全局变量 解决方案: 1.下标法 ...

  4. 201871010114-李岩松《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  5. Nginx内置变量以及日志格式变量

    $args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符 ...

  6. mac pro下安装安装 SymPy 和 matplotlib报错解决方案

    因为自己写python分析时候要用到这两个库,但是mac 上安装不成功.原来是要安装原来装 matplotlib 之前先要安装 freetyp 和 libpng. brew install freet ...

  7. python-下载网页链接

    from urllib.request import urlretrieve url = 'http://images.jupiterimages.com/common/detail/27/68/22 ...

  8. MyBatis 插入记录同时获取主键

    MyBatis 插入记录同时获取主键 MyBatis 插入记录同时获取主键的系统界面 useGeneratedKeys 属性 keyProperty 属性 keyColumn 属性 selectKey ...

  9. luoguP4294 [WC2008]游览计划

    题意 斯坦纳树裸题. 显然答案是棵树. 设\(f[i][s]\)表示以\(i\)为根,集合为\(s\)的最小代价. 先在同根之间转移: \(f[i][s]=min(f[i][t]+f[i][s\ xo ...

  10. <Math> 50 367

    50. Pow(x, n) abs (Integer.MIN_VALUE) > Integer.MAX_VALUE class Solution { public double myPow(do ...