前言:当我们要实现Python多进程时,可以使用os模块中的fork()函数和multiprocessing模块,那么它们之间的用法和区别呢?下来,我们着重进行讲解:

友情链接:

  1. Python多进程中的multiprocessing
  2. Python并发编程之进程(守护进程、锁、信号量)

文章目录

  • 一、两者区别
  • 二、fork()
  • 三、getpid()、getppid()
  • 四、多进程修改全局变量
  • 五、多次fork问题

一、两者区别

首先,我们要搞清楚这两个模块的区别是什么?

  1. fork()是基于Unix/Linux内核的函数,在windows中无法使用。
  2. 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

说明:

  1. 程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中。
  2. 然后父进程和子进程都会从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相关推荐

  1. Python多进程中多参数问题

    要注意的一点是:传递给进程的参数必须是可序列化的,常见的数据类型都是可序列化的,自定义的类一般是不可序列化的,(在java中有将自定类写为可序列化的方式,不知道python中有没有,懒得查了)如果需要 ...

  2. python多进程中apply和apply_async用法详解

    python在同一个线程中多次执行同一方法时,假设该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使用multiprocessing.Pool(processes ...

  3. 在python多进程中使用manager和Barrier

    注意:Barrier是PYTHON3才有的功能,在2中无法测试. #!/usr/bin/env python # -*- coding: utf-8 -*-import multiprocessing ...

  4. python 多进程中锁的使用方法

    一.不加锁 from multiprocessing import Process,Lock import timedef get():for i in range(3):time.sleep(1)p ...

  5. python中os.fork()理解

    import ospid = os.fork()if 0 > pid:print('调用出错') elif 0 == pid:print('我是子进程%s我的父进程是%s' % (os.getp ...

  6. python fork_Python 中fork()理解

    参考:多进程- 廖雪峰的官方网站 首先,在python中我们要实现多进程,有两个模块可以用: 1)os中的fork()函数 2)multiprocessing模块 那么这两个模块有什么区别呢? 在fo ...

  7. Python 多进程 fork()详解

    进程 进程是程序的一次动态执行过程,它对应了从代码加载.执行到执行完毕的一个完整过程.进程是系统进行资源分配和调度的一个独立单位.进程是由代码(堆栈段).数据(数据段).内核状态和一组寄存器组成. 在 ...

  8. python中os.fork()方法

    在Python中,如果我们希望并发的执行一些任务,最简单的办法是使用os下面的fork()方法,例如 import osprint("OSFork")contentStr = 'h ...

  9. linux中的fork方法(python)

    前言: Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一 ...

最新文章

  1. 范进中举,读个博士到底有多难?看看就知道了!
  2. 人群行为分析--Understanding Pedestrian Behaviors from Stationary Crowd Groups
  3. boost--线程同步
  4. OpenCASCADE可视化:3D演示之创建3D场景
  5. 【SQLite】简单的基本使用步骤
  6. Wine cannot find the ncurses library (libncurses.so.5)
  7. mysql 创建事件
  8. [windows phone 7 ]查看已安装程序GUID
  9. 七、线性表的链式存储结构
  10. 企业实战_11_MyCat垂直拆分相关配置
  11. ajax modelmap,spring mvc+ajax处理JSON返回前台的方法
  12. java的condition_java并发编程之Condition
  13. JAVA设计模式《四》
  14. VB.NET工作笔记003---使用ASP_vbs脚本_或vb.net调用Sqlserver DTS文件
  15. H236各个版本的区别总结
  16. 三级网络技术IP地址
  17. Fast Deep Matting for Portrait Animation on Mobile Phone
  18. 记一次亚马逊扩容报错data size unchanged, skipping问题
  19. 深度学习模型试跑(十三):stylegan3
  20. MySQL数据库入门(三)--- 查询、权限、join语法、外键、备份

热门文章

  1. JAVA学习总结十五
  2. c# ThreadPool.QueueUserWorkItem线程池的应用
  3. discuz php升级,DiscuzX 论坛安装升级
  4. 编译原理——识别的字集为 包含奇数个1和奇数个0的二进制数串
  5. (win7 UEFI安装)顺便说说UEFI、GPT和Secure Boot
  6. Find My资讯|美国苹果AirTag市场大涨,助推Find My技术的发展
  7. PostgreSQL COALESCE
  8. python定时器爬取豆瓣音乐Top榜歌名
  9. Mac下的vim简单配置
  10. python实现多项式回归