Python多进程中的fork
前言:当我们要实现Python多进程时,可以使用os
模块中的fork()
函数和multiprocessing
模块,那么它们之间的用法和区别呢?下来,我们着重进行讲解:
友情链接:
- Python多进程中的multiprocessing
- Python并发编程之进程(守护进程、锁、信号量)
文章目录
- 一、两者区别
- 二、fork()
- 三、getpid()、getppid()
- 四、多进程修改全局变量
- 五、多次fork问题
一、两者区别
首先,我们要搞清楚这两个模块的区别是什么?
fork()
是基于Unix/Linux内核的函数,在windows中无法使用。multiprocessing
模块作为跨平台的存在。
Unix/Linux操作系统提供了一个
fork()
系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。
二、fork()
Python的os
模块封装了常见的系统调用,其中就包括fork()
,可以在Python程序中轻松创建子进程:
import os# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()if pid == 0:print('哈哈1')
else:print('哈哈2')
运行结果:
哈哈2
哈哈1
说明:
- 程序执行到
os.fork()
时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中。 - 然后父进程和子进程都会从
fork()
函数中得到一个返回值,在子进程中这个值一定是0,而父进程中是子进程的ID号。
子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以
fork
出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()
就可以拿到父进程的ID。
三、getpid()、getppid()
import osrpid = 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)
父子进程都可以执行这里的代码
四、多进程修改全局变量
import os
import timenum = 0# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()if pid == 0:num += 1print('哈哈1---num=%d'%num)
else:time.sleep(1)num += 1print('哈哈2---num=%d'%num)
运行结果:
哈哈1---num=1
哈哈2---num=1
总结:
- 多进程中,每个进程中所有数据(包括全局变量)都各有拥有一份,互不影响。
五、多次fork问题
如果在一个程序,有2次的fork
函数调用,是否就会有3个进程呢?
import os
import time# 注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以
pid = os.fork()
if pid == 0:print('哈哈1')
else:print('哈哈2')pid = os.fork()
if pid == 0:print('哈哈3')
else:print('哈哈4')time.sleep(1)
父子进程的执行顺序:
- 父进程、子进程执行顺序没有规律,完全取决于操作系统的调度算法。
Python多进程中的fork相关推荐
- Python多进程中多参数问题
要注意的一点是:传递给进程的参数必须是可序列化的,常见的数据类型都是可序列化的,自定义的类一般是不可序列化的,(在java中有将自定类写为可序列化的方式,不知道python中有没有,懒得查了)如果需要 ...
- python多进程中apply和apply_async用法详解
python在同一个线程中多次执行同一方法时,假设该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使用multiprocessing.Pool(processes ...
- 在python多进程中使用manager和Barrier
注意:Barrier是PYTHON3才有的功能,在2中无法测试. #!/usr/bin/env python # -*- coding: utf-8 -*-import multiprocessing ...
- python 多进程中锁的使用方法
一.不加锁 from multiprocessing import Process,Lock import timedef get():for i in range(3):time.sleep(1)p ...
- python中os.fork()理解
import ospid = os.fork()if 0 > pid:print('调用出错') elif 0 == pid:print('我是子进程%s我的父进程是%s' % (os.getp ...
- python fork_Python 中fork()理解
参考:多进程- 廖雪峰的官方网站 首先,在python中我们要实现多进程,有两个模块可以用: 1)os中的fork()函数 2)multiprocessing模块 那么这两个模块有什么区别呢? 在fo ...
- Python 多进程 fork()详解
进程 进程是程序的一次动态执行过程,它对应了从代码加载.执行到执行完毕的一个完整过程.进程是系统进行资源分配和调度的一个独立单位.进程是由代码(堆栈段).数据(数据段).内核状态和一组寄存器组成. 在 ...
- python中os.fork()方法
在Python中,如果我们希望并发的执行一些任务,最简单的办法是使用os下面的fork()方法,例如 import osprint("OSFork")contentStr = 'h ...
- linux中的fork方法(python)
前言: Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一 ...
最新文章
- 范进中举,读个博士到底有多难?看看就知道了!
- 人群行为分析--Understanding Pedestrian Behaviors from Stationary Crowd Groups
- boost--线程同步
- OpenCASCADE可视化:3D演示之创建3D场景
- 【SQLite】简单的基本使用步骤
- Wine cannot find the ncurses library (libncurses.so.5)
- mysql 创建事件
- [windows phone 7 ]查看已安装程序GUID
- 七、线性表的链式存储结构
- 企业实战_11_MyCat垂直拆分相关配置
- ajax modelmap,spring mvc+ajax处理JSON返回前台的方法
- java的condition_java并发编程之Condition
- JAVA设计模式《四》
- VB.NET工作笔记003---使用ASP_vbs脚本_或vb.net调用Sqlserver DTS文件
- H236各个版本的区别总结
- 三级网络技术IP地址
- Fast Deep Matting for Portrait Animation on Mobile Phone
- 记一次亚马逊扩容报错data size unchanged, skipping问题
- 深度学习模型试跑(十三):stylegan3
- MySQL数据库入门(三)--- 查询、权限、join语法、外键、备份