Python—创建进程的三种方式
方式一:os.fork()
- 子进程是从os.fork得到的值,然后赋值开始执行的。即子进程不执行os.fork,从得到的值开始执行。
- 父进程中fork之前的内容子进程同样会复制,但父子进程空间独立,fork之后的修改不会影响到对方。
- 父子进程在执行上互不影响,谁先执行,谁先执行完不确定。
- 父子进程之间相互独立,全局变量,局部变量都互不影响。
- 父进程执行完就结束,子进程会继续执行。主进程不会因为子进程没结束而等待。
- 子进程虽然复制父进程的空间,但是有自己的特性,比如自己的PID,进程PCB,进程栈空间等。
单个fork
import os, time g_num = 100
ret = os.fork() # 父进程得到的ret的值等于子进程的pid。子进程得到的ret的值等于0。 if ret < 0:
print "---创建一级子进程失败---"
elif ret == 0:
print "---子进程的pid:%d" % os.getpid()
g_num += 1
else:
print "---父进程的pid:%d" % os.getpid()
while True:
time.sleep(3)
break
print "进程执行完毕", g_num # 父进程打印结果为:100,子进程打印结果为:101
多个fork
import os,time # 父进程执行下面的fork
ret = os.fork()
if ret==0:
print("--1--") # 子进程
else:
print("--2--") # 父进程 # 父子进程都执行下面的fork,即父子进程都创建了子进程,此时共有四个进程
ret = os.fork()
if ret==0:
print("--11--")
else:
print("--22--")
方式二:multiprocessing.Process()
- 子进程执行的函数结束,子进程就结束了。父进程等待子进程结束后才退出。
- 子进程修改全局变量或者局部变量,对父进程没有丝毫影响。
- 父进程执行完不退出,子进程会继续执行。父进程等待子进程结束后才退出。
# --coding:utf8--
from multiprocessing import Process
import os,time,random def test(num, msg):
print "---子进程的pid=%d, ppid=%d, num=%d, msg=%s" % (os.getpid(), os.getppid(), num, msg)
for i in range(random.randint(1, 5)):
print("----%d---"%i)
time.sleep(1) # p = Process(target=test, args=(), kwargs={}) # 当函数没有参数时候,可以这样写
p = Process(target=test, args=(100,), kwargs={"msg":"hello"})
p.start() # 让这个进程开始执行test函数里的代码
p.join() # 堵塞,可以加参数p.join(1)。等到p这个对象标记的进程结束之后,才会继续向下走 print "---父进程的pid=%d" % os.getpid()
方式三:继承multiprocessing.Process类
from multiprocessing import Process
import os, time # 自定义的进程类
class MyProcess(Process):
def __init__(self, value):
self.value = value
Process.__init__(self)
# super(MyProcess,self).__init__() # 在自定义的进程类中重写父类(Process)的run()方法
def run(self):
print "---子进程:%s开始执行,父进程pid:%s"%(os.getpid(),os.getppid())
while True:
print("---传的参数值为:%d---" % self.value)
time.sleep(1) if __name__ == '__main__':
p = MyProcess(3)
p.start()
p.join(6) # 阻塞等到子进程执行结束,超时时间为6秒。不加参数,会一直阻塞等待下去。
while True:
print "---main---"
time.sleep(1)
注意:p.start()函数后面的p.join()可以不加,这时父子进程同时运行。
如果加上p.join(),则父进程会一直阻塞等待子进程运行结束后才运行。子进程不结束,父进程一直等待不运行。
如果加上p.join(6),则父进程最多会阻塞等待子进程运行6秒,6秒之后不管子进程是否结束,父进程都会继续往下运行。即使父进程先运行结束,父进程也不会退出,而是会等待子进程运行结束退出后,父进程才退出。如果子进程提前结束,则父进程提前继续往下运行。
总之:不管加不加p.join()函数,父进程都会等待子进程结束后才退出。加上p.join()函数只是起到让父进程阻塞等待,让子进程先运行的作用。
Python—创建进程的三种方式的更多相关文章
- python实现进程的三种方式及其区别
在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.fork() if ret == 0: # ...
- python创建进程的两种方式
1.方式1 import time import multiprocessing def task(arg): time.sleep(2) print(arg) def run(): # 进程1 p1 ...
- python创建字典的三种方式
创建空字典: dict_eq={} print(type(dict)) 直接赋值创建字典: dict_eq={'a':1,'b':2,'c':'adbc'} 通过关键字dict和关键字参数创建 dic ...
- python核心高级学习总结3-------python实现进程的三种方式及其区别
python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理
动态创建元素的三种方式: 第一种: Document.write(); <body> <input type="button" id="btn" ...
- spring创建bean的三种方式
spring创建bean的三种方式: 1通过构造方法创建bean(最常用) 1.1 spring默认会通过无参构造方法来创建bean,如果xml文件是这样配置,则实体类中必须要有无参构造方法,无参构造 ...
- Java并发编程:Java创建线程的三种方式
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
随机推荐
- C语言笔记 02_基本语法&数据类型&变量
基本语法 令牌 C 程序由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下面的 C 语句包括五个令牌: printf("Hello, World! \n&qu ...
- 解决Entity 实体类中加了@Id 注解后仍然出现org.hibernate.AnnotationException: No identifier specified for entity 错误
启动报错如下图所示: 解决方案: 查看网上的资料,大部分都说在实体类中没有添加加主键的注解@Id,这个是必须的.但是我的实体类中明明已经添加了@Id,为什么还会报这个错误呢? 后来检查了很久,发现是我 ...
- 带你自行搭建虚拟机和Redis集群环境,值得收藏!
前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...
- HALCON数据类型和C#对应数据类型的对比
摘要:HALCON数据类型:Iconic Variables(图形变量).Control Variables(控制变量).在C#中,图形变量用HObject声明,控制变量用HTuple声明.(halc ...
- vue - Error: Can't resolve '@/assets/img/github.svg (vue-cli3.0,无法解析.svg图片,已解决)
用vue脚手架(vue-cli3.0)生成的目录,无法解析.svg图片的问题 <img src="@/assets/img/github.svg" alt="git ...
- Windows添加自定义开机用户登录启动程序
默认的启动程序 Ctrl+shift -> Esc调用任务管理器-->启动项选项即可完成计算机开机自启动选项,不过这里只有系统默认添加的. 添加自定义开机启动程序 Windows+R调用运 ...
- Python3操作MySQL基于PyMySQL封装的类
Python3操作MySQL基于PyMySQL封装的类 在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...
- Keepalived集群软件高级使用(工作原理和状态通知)
1.介绍 Keeaplived主要有两种应用场景,一个是通过配置keepalived结合ipvs做到负载均衡(LVS+Keepalived),有此需求者可参考以往博文:http://lizhenlia ...
- 池化技术(二)HikariCP是如何管理数据库连接的?
基于依赖程序的版本信息:HikariCP:3.3.1 驱动程序mysql-connector-java:8.0.17 上一篇:Druid是如何管理数据库连接的 零.类图和流 ...
- 如何解决Sublime text3文件名称中文乱码问题
在sublime text 3中,Preference, Settings-User,最后加上一行 "dpi_scale": 1.0 { "auto_complete_t ...