python实现进程的三种方式及其区别
1.fork()方法
- ret = os.fork()
- if ret == 0:
- #子进程
- else:
- #父进程
这是python中实现进程最底层的方法,其他两种从根本上也是利用fork()方法来实现的,下面是fork()方法的原理示意图
- import os
- rpid = os.fork()
- if rpid<0:
- print("fork调⽤失败。 ")
- elif rpid == 0:
- print("我是⼦进程( %s) , 我的⽗进程是(%s) "%(os.getpid(),os.getppid()))
- x+=1
- else:
- print("我是⽗进程( %s) , 我的⼦进程是( %s) "%(os.getpid(),rpid))
- print("⽗⼦进程都可以执⾏这⾥的代码")
运行结果:
- 我是⽗进程( 19360) , 我的⼦进程是( 19361)
- ⽗⼦进程都可以执⾏这⾥的代码
- 我是⼦进程( 19361) , 我的⽗进程是( 19360)
- ⽗⼦进程都可以执⾏这⾥的代码
- #coding=utf-8
- import os
- import time
- num = 0
- # 注意, fork函数, 只在Unix/Linux/Mac上运⾏, windows不可以
- pid = os.fork()
- if pid == 0:
- num+=1
- print('哈哈1---num=%d'%num)
- else:
- time.sleep(1)
- num+=1
- print('哈哈2---num=%d'%num)
运行结果
- 哈哈1---num=1
- 哈哈2---num=1
- #多进程不共享全局变量
多次fork()问题
2,Process方法
- from multiprocessing import Process
- p1=Process(target=xxxx)
- p1.start()
- #coding=utf-8
- from multiprocessing import Process
- import os
- # ⼦进程要执⾏的代码
- def run_proc(name):
- print('⼦进程运⾏中, name= %s ,pid=%d...' % (name, os.getpid()))
- if __name__=='__main__':
- print('⽗进程 %d.' % os.getpid())
- p = Process(target=run_proc, args=('test',))
- print('⼦进程将要执⾏')
- p.start()
- p.join()
- print('⼦进程已结束')
- ⽗进程 4857.
- ⼦进程将要执⾏
- ⼦进程运⾏中, name= test ,pid=4858...
- ⼦进程已结束
is_alive(): 判断进程实例是否还在执⾏;
join([timeout]): 是否等待进程实例执⾏结束, 或等待多少秒;
start(): 启动进程实例( 创建⼦进程) ;
run(): 如果没有给定target参数, 对这个对象调⽤start()⽅法时, 就将执⾏对象中的run()⽅法;
terminate(): 不管任务是否完成, ⽴即终⽌;
3,利用进程池Pool
- from multiprocessing import Pool
- pool=Pool(3)
- pool.apply_async(xxxx)
- from multiprocessing import Pool
- import os,time,random
- def worker(msg):
- t_start = time.time()
- print("%s开始执⾏,进程号为%d"%(msg,os.getpid()))
- #random.random()随机⽣成0~1之间的浮点数
- time.sleep(random.random()*2)
- t_stop = time.time()
- print(msg,"执⾏完毕, 耗时%0.2f"%(t_stop-t_start))
- po=Pool(3) #定义⼀个进程池, 最⼤进程数3
- for i in range(0,10):
- #Pool.apply_async(要调⽤的⽬标,(传递给⽬标的参数元祖,))
- #每次循环将会⽤空闲出来的⼦进程去调⽤⽬标
- po.apply_async(worker,(i,))
- print("----start----")
- po.close() #关闭进程池, 关闭后po不再接收新的请求
- po.join() #等待po中所有⼦进程执⾏完成, 必须放在close语句之后
- print("-----end-----")
运行结果
- ----start----
- ----start----
- 0开始执⾏,进程号为5025
- ----start----
- 1开始执⾏,进程号为5026
- ----start----
- ----start----
- ----start----
- ----start----
- ----start----
- ----start----
- ----start----
- 2开始执⾏,进程号为5027
- 0 执⾏完毕, 耗时0.58
- 3开始执⾏,进程号为5025
- 1 执⾏完毕, 耗时0.70
- 4开始执⾏,进程号为5026
- 2 执⾏完毕, 耗时1.36
- 5开始执⾏,进程号为5027
- 3 执⾏完毕, 耗时1.03
- 6开始执⾏,进程号为5025
- 4 执⾏完毕, 耗时1.12
- 7开始执⾏,进程号为5026
- 5 执⾏完毕, 耗时1.25
- 8开始执⾏,进程号为5027
- 7 执⾏完毕, 耗时1.28
- 9开始执⾏,进程号为5026
- 6 执⾏完毕, 耗时1.91
- 8 执⾏完毕, 耗时1.23
- 9 执⾏完毕, 耗时1.38
- -----end-----
- from multiprocessing import Pool
- import os,time,random
- def worker(msg):
- t_start = time.time()
- print("%s开始执⾏,进程号为%d"%(msg,os.getpid()))
- #random.random()随机⽣成0~1之间的浮点数
- time.sleep(random.random()*2)
- t_stop = time.time()
- print(msg,"执⾏完毕, 耗时%0.2f"%(t_stop-t_start))
- po=Pool(3) #定义⼀个进程池, 最⼤进程数3
- for i in range(0,10):
- po.apply(worker,(i,))
- print("----start----")
- po.close() #关闭进程池, 关闭后po不再接收新的请求
- po.join() #等待po中所有⼦进程执⾏完成, 必须放在close语句之后
- print("-----end-----")
运行结果
- 0开始执⾏,进程号为5280
- 0 执⾏完毕, 耗时0.91
- 1开始执⾏,进程号为5281
- 1 执⾏完毕, 耗时1.59
- 2开始执⾏,进程号为5282
- 2 执⾏完毕, 耗时1.25
- 3开始执⾏,进程号为5280
- 3 执⾏完毕, 耗时0.53
- 4开始执⾏,进程号为5281
- 4 执⾏完毕, 耗时1.49
- 5开始执⾏,进程号为5282
- 5 执⾏完毕, 耗时0.18
- 6开始执⾏,进程号为5280
- 6 执⾏完毕, 耗时1.51
- 7开始执⾏,进程号为5281
- 7 执⾏完毕, 耗时0.88
- 8开始执⾏,进程号为5282
- 8 执⾏完毕, 耗时1.08
- 9开始执⾏,进程号为5280
- 9 执⾏完毕, 耗时0.12
- ----start----
- -----end-----
apply_async(func[, args[, kwds]]) : 使⽤⾮阻塞⽅式调⽤func( 并⾏执⾏, 堵塞⽅式必须等待上⼀个进程退出才能执⾏下⼀个进程) , args为传递给func的参数列表, kwds为传递给func的关键字参数列表;
python实现进程的三种方式及其区别的更多相关文章
- python核心高级学习总结3-------python实现进程的三种方式及其区别
python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...
- Python—创建进程的三种方式
方式一:os.fork() 子进程是从os.fork得到的值,然后赋值开始执行的.即子进程不执行os.fork,从得到的值开始执行. 父进程中fork之前的内容子进程同样会复制,但父子进程空间独立,f ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- Python实现定时执行任务的三种方式简单示例
本文实例讲述了Python实现定时执行任务的三种方式.分享给大家供大家参考,具体如下: 1.定时任务代码 import time,os,sched schedule = sched.scheduler ...
- Python格式化输出的三种方式
Python格式化输出的三种方式 一.占位符 程序中经常会有这样场景:要求用户输入信息,然后打印成固定的格式比如要求用户输入用户名和年龄,然后打印如下格式:My name is xxx,my age ...
- Java实现线程的三种方式和区别
Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...
- 记住 Python 变量类型的三种方式
title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...
- javascript函数命名的三种方式及区别
1, function fn(val1,val2) { alert(val1+val2); } fn(1,2); 2, var fn=function() { alert(val1+val2); } ...
- React创建组件的三种方式及其区别
内容转载于http://www.cnblogs.com/wonyun/p/5930333.html React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归; 具体的三种方式: ...
随机推荐
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表格:联合使用所有表格类
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 夯实Java基础(二十三)——Java8新特征之Stream API
1.Stream简介 Java8中除了引入了好用的Lambda表达式.Date API之外,另外还有一大亮点就是Stream API了,也是最值得所有Java开发人员学习的一个知识点,因为它的功能非常 ...
- Linux命令:sed命令
sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏 ...
- 树莓派4B踩坑指南 - (3)无显示器连接
无显示器连接 WiFi:如果是原装系统,直接修改wpa_supplicant.conf文件后,放入boot即可(一定注意ssid名称不要写错!!惨痛教训T^T) SSH:在boot盘下新建一个 SSH ...
- Linux引导过程!(重点)
1.开机自检:服务器开机后,将根据主板BIOS (基本输入系统),中的设置对CPU .内存.显卡.键盘等设备进行初步检测,并初始化部分硬件. 2.MBR 引导:当从本机硬盘中启动系统时,首先根据硬盘中 ...
- Python 之网络编程之进程总体概要
一: 进程的概念:(Process) 进程就是正在运行的程序,它是操作系统中,资源分配的最小单位. 资源分配:分配的是cpu和内存等物理资源 进程号是进程的唯一标识 同一个程序执行两次之后是两个进程 ...
- ubuntu 解压命令全览
.tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...
- PHP+Mysql实现网站顶和踩投票功能实例
PHP+Mysql实现网站顶和踩投票功能实例,通过记录用户IP,判断用户的投票行为是否有效,该实例也可以扩展到投票系统中. 首先我们在页面上放置“顶”和“踩”的按钮,即#dig_up和#dig_dow ...
- VS2010解决闪退的方法
VS2010解决闪退的原因 前言 在利用vs2010编译器进行编写程序的时候程序结果无法看到,针对上述问题有如下两个解决方法: 方法1. 在程序结束之前(return之前)加 system(&quo ...
- java并发队列
阻塞队列 常见的阻塞队列有ArrayBlockingQueue,LinkedBlockingDeque,LinkedBlockingQueue,这些队列有界且可以阻塞线程 ArrayBlockingQ ...