python通过多进程实行多任务
#原创,转载请联系
在开始之前,我们要知道什么是进程。道理很简单,你平时电脑打开QQ客户端,就是一个进程。再打开一个QQ客户端,又是一个进程。那么,在python中如何用一篇代码就可以开启几个进程呢?通过一个简单的例子来演示:
import multiprocessing import timedef task1():while True:time.sleep(1)print("I am task1")def task2():while True:time.sleep(2)print("I am task2")if __name__ == '__main__':p1 = multiprocessing.Process(target=task1) # multiprocessing.Process创建了子进程对象p1p2 = multiprocessing.Process(target=task2) # multiprocessing.Process创建了子进程对象p2p1.start() # 子进程p1启动p2.start() # 子进程p2启动print("I am main task") # 这是主进程的任务 输出结果:I am main taskI am task1I am task2I am task1I am task1I am task2I am task1I am task1I am task2......
可以看到子进程对象是由multiprocessing模块中的Process类创建的。除了p1,p2两个被创建的子进程外。当然还有主进程。主进程就是我们从头到尾的代码,包括子进程也是由主进程创建的。
注意的点有:
1.首先解释一下并发:并发就是当任务数大于cpu核数时,通过操作系统的各种任务调度算法,实现多个任务“一起”执行。(实际上总有一些任务不在执行,因为切换任务相当快,看上去想同时执行而已。)
2.当是并发的情况下,子进程与主进程的运行都是没有顺序的,CPU会采用时间片轮寻的方式,哪个程序先要运行就先运行哪个。
3.主进程会默认等待所有子进程执行完毕后,它才会退出。所以在上面的例子中,p1,p2子进程是死循环进程,主进程的最后一句代码print("I am main task")虽然运行完了,但是主进程并不会关闭,他会一直等待着子进程。
4.主进程默认创建的是非守护进程。注意,结合3.和5.看。
5.但是!但是!如果子进程是守护进程的话,那么主进程运行完最后一句代码后,主进程会直接关闭,不管你子进程运行完了没有!
-------------------------------------------------------------------------------------------------------------我是一条分割线------------------------------------------------------------------------------------------------------------------------------------
不相信?
那我们来测试下
import multiprocessing import timedef task1():while True:time.sleep(1)print("I am task1")def task2():while True:time.sleep(2)print("I am task2")if __name__ == '__main__':p1 = multiprocessing.Process(target=task1)p2 = multiprocessing.Process(target=task2)p1.daemon = True # 设置p1子进程为守护进程p2.daemon = True # 设置p2子进程为守护进程p1.start()p2.start()print("I am main task") 输出结果:I am main task
输出结果是不是有点奇怪。为什么p1,p2子进程都没有输出的?
让我们来整理一下思路:
1.创建p1,p2子进程
2.设置p1,p2子进程为守护进程
3.p1,p2子进程开启
4.p1,p2子进程代码里面都有休眠时间,所以cpu为了不浪费时间,先做主进程后续的代码。
5.执行主进程后续的代码,print("I am main task")
6.主进程后续的代码执行完成了,所以剩下的子进程是守护进程的,全都要关闭了。但是,如果主进程的代码执行完了,有两个子进程,一个是守护的,一个非守护的,怎么办呢?其实,他会等待非守护的那个子进程运行完,然后三个进程一起关闭。
7.p1,p2还在休眠时间内就被终结生命了,所以什么输出都没有。
里面涉及到两个知识点:
1.当主进程结束后,会发一个消息给子进程(守护进程),守护进程收到消息,则立即结束
2.CPU是按照时间片轮寻的方式来运行多进程的。哪个合适的哪个运行,如果你的子进程里都有time.sleep。那我CPU为了不浪费资源,肯定先去干点其他的事情啊。
那么,守护进程随时会被中断,他的存在意义在哪里的?
其实,守护进程主要用来做与业务无关的任务,无关紧要的任务,可有可无的任务,比如内存垃圾回收,某些方法的执行时间的计时等。
-------------------------------------------------------------------------------------------------------------我是一条分割线------------------------------------------------------------------------------------------------------------------------------------
虽然知道怎么简单的创建子进程,但是如果要创建的子进程要传入参数,应该怎么操作呢?
import multiprocessingdef task(a,b,*args,**kwargs):print("a")print("b")print(args)print(kwargs)if __name__ == '__main__':p1 = multiprocessing.Process(target=task,args=(1,2,3,4,5,6),kwargs={"name":"chichung","age":23})p1.start()print("主进程已经运行完最后一行代码啦") 输出: 主进程已经运行完最后一行代码啦ab(3, 4, 5, 6){'name': 'chichung', 'age': 23}
子进程要运行的函数需要传入变量a,b,一个元组,一个字典。我们创建子进程的时候,变量a,b要放进元组里面,task函数取的时候会把前两个取出来,分别赋值给a,b了。
-------------------------------------------------------------------------------------------------------------我是一条分割线------------------------------------------------------------------------------------------------------------------------------------
创建的子进程有几个常用的方法:
p.start | 开始执行子线程 |
p.name | 查看子进程的名称 |
p.pid | 查看子进程的id |
p.is_alive | 判断子进程是否存活 |
p.join(timeout) |
阻塞主进程,当子进程p运行完毕后,再解开阻塞,让主进程运行后续的代码 如果timeout=2,就是阻塞主进程2s,这2s内主进程不能运行后续的代码。过了2s后,就算子进程没有运行完毕,主进程也能运行后续的代码 |
p.terminate | 终止子进程p的运行 |
import multiprocessingdef task(a,b,*args,**kwargs):print("a")print("b")print(args)print(kwargs)if __name__ == '__main__':p1 = multiprocessing.Process(target=task,args=(1,2,3,4,5,6),kwargs={"name":"chichung","age":23})p1.start()print("p1子进程的名字:%s" % p1.name)print("p1子进程的id:%d" % p1.pid)p1.join()print(p1.is_alive())输出: p1子进程的名字:Process-1 p1子进程的id:19345 a b (3, 4, 5, 6) {'name': 'chichung', 'age': 23} False
这个没什么好说的,自己体会一下......
-------------------------------------------------------------------------------------------------------------我是一条分割线------------------------------------------------------------------------------------------------------------------------------------
进程之间是不可以共享全局变量的,即使子进程与主进程。道理很简单,一个新的进程,其实就是占用一个新的内存空间,不同的内存空间,里面的变量肯定不能够共享的。实验证明如下:
import multiprocessingg_list = [123]def task1():g_list.append("task1")print(g_list)def task2():g_list.append("task2")print(g_list)def main_process():g_list.append("main_processs")print(g_list)if __name__ == '__main__':p1 = multiprocessing.Process(target=task1)p2 = multiprocessing.Process(target=task2)p1.start()p2.start()main_process() 输出:[123, 'main_processs'][123, 'task1'][123, 'task2']
一针见血了吧,哈哈~
----------------------------------------------------------------------------------------------------------我是一条结束线,谢谢观看~-----------------------------------------------------------------------------------------------------------------------
转载于:https://www.cnblogs.com/chichung/p/9532962.html
python通过多进程实行多任务相关推荐
- python 多线程实现多任务,多进程实行多任务
目录 1 多线程实现多任务 1.1 什么是线程? 1.2 一个程序实现多任务的方法 1.3 多线程的创建方式 1.3.1 创建threading.Thread对象 1.3.2 继承threading. ...
- python中多进程+协程的使用以及为什么要用它
前面讲了为什么python里推荐用多进程而不是多线程,但是多进程也有其自己的限制:相比线程更加笨重.切换耗时更长,并且在python的多进程下,进程数量不推荐超过CPU核心数(一个进程只有一个GIL, ...
- Python multiprocess 多进程模块
转发:http://www.langzi.fun/Python multiprocess 多进程模块.html 需要注意的是,如果使用多线程,用法一定要加上if __name__=='__main__ ...
- Python TimedRotatingFileHandler 多进程环境下的问题和解决方法
Python TimedRotatingFileHandler 多进程环境下的问题和解决方法 原文:https://my.oschina.net/lionets/blog/796438 Python ...
- python 利用多进程实现文件的拷贝
python 利用多进程实现文件的拷贝 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37338590/article/details/784 ...
- python多进程优化_『Python』多进程处理
尝试学习python的多进程模组,对比多线程,大概的区别在: 1.多进程的处理速度更快 2.多进程的各个子进程之间交换数据很不方便 多进程调用方式 进程基本使用multicore() 进程池优化进程的 ...
- python多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- python爬虫多进程_Python爬虫技术--基础篇--多进程
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...
- Python使用多进程提高网络爬虫的爬取速度
多线程技术并不能充分利用硬件资源和大幅度提高系统吞吐量,类似需求应使用多进程编程技术满足. 以爬取中国工程院院士简介和照片为例,参考代码如下,请自行分析目标网页结构并与参考代码进行比对.另外需要注意, ...
- python分布式多进程框架 Ray
全栈工程师开发手册 (作者:栾鹏) python教程全解 并行和分布式计算是现代应用程序的主要内容.我们需要利用多个核心或多台机器来加速应用程序或大规模运行它们.网络爬虫和搜索所使用的基础设施并不是在 ...
最新文章
- crontab安装_django-crontab实现服务端的定时计划任务
- 小米mix2s html,【小米MIX2s评测】性能·骁龙845确实很强 但小米没压住_小米 MIX 2s(6GB RAM/全网通)_手机评测-中关村在线...
- 【转】mssql中大小写的区分
- 《JavaScript模式》精要
- linux系统自带python_Linux删除系统自带版本Python过程详解
- Android Lint 去除重复资源 之 idea探究
- Code On Earth
- KEIL5 编译器导致的程序异常
- 有关javabean的说法不正确的是_关于 JavaBean, 下列叙述中不正确的是 ( ) 。_学小易找答案...
- 微软公有云魅力之Traffic Manager
- oracle簇详解,Oracle 簇的使用详解
- 《经济的律动》徐远(作者)epub+mobi+azw3格式下载
- 设置窗体显示在屏幕的位置
- mysql秒退原因_解决MySql客户端秒退问题(找不到my.ini)
- linux GRO相关
- 四十七、批量操作数据
- 51自学网php视频教程全集,51自学网免费PhotoShop视频教程全集
- h5怎么获取微信用户openId,h5如何获取微信用户openId
- linux挂载磁盘只如何改为读写
- SpringBoot 定时器的三种方式
热门文章
- scp创建远程目录_如何在 HPC 硬件上远程运行大型仿真?
- 会议室预约微信小程序推荐_又是BYPASS!微信小程序预约 YEEZY BOOST 350 V2 只要3S就能搞定!...
- oracle数据库SQL防止超长,SQL Server和Oracle防止数据锁定的比较
- Java伪装csrss_结束伪装成系统进程名的进程的批处理
- 四十二、在线预览pdf文件
- layui动态渲染生成select的option值
- 4G江湖大战全面开启 移动4G用户数突破9000万
- Nginx 读写分离详解
- 动态设置全屏、取消全屏的方法,以及切换全屏保持内容位置不变的方法
- ios-后台运行UIApplication