Python多进程fork()函数详解


Posted in Python onFebruary 22, 2019

进程

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

在多任务操作系统中,通过运行多个进程来并发地执行多个任务。由于每个线程都是一个能独立执行自身指令的不同控制流,因此一个包含多个线程的进程也能够实现进程内多任务的并发执行。

进程是一个内核级的实体,进程结构的所有成分都在内核空间中,一个用户程序不能直接访问这些数据。

进程的状态:

创建、准备、运行、阻塞、结束。

进程间的通信方式可以有:

  • 文件
  • 管道
  • socket
  • 信号
  • 信号量
  • 共享内存

要让Python程序实现多进程(multiprocessing),必须先了解操作系统的相关知识。

在Unix/Linux操作系统提供了一个fork()函数,它非常特殊,调用一次,返回两次,因为操作系统将当前的进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回。

Python中的进程

  • os.fork()
  • subprocess
  • processing
  • multiprocessing

fork()函数

函数原型:

Help on built-in function fork in module posix:
fork(...)
  fork() -> pid
  Fork a child process.
  Return 0 to child process and PID of child to parent process.

从fork()函数原型来看,它也属于一个内建函数。

子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork()出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

Python的进程函数fork()是在os模块,下面是一个关于进程的例子:

import os
print os.getpid() #获取子进程的进程号
pid = os.fork()
if pid == 0 :
 print 'I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid())
else :
 print 'I (%s) just created a child process (%s).' % (os.getpid(), pid)

执行结果:

1526
I (1526) just created a child process (1527).
I am child process (1527) and my parent is 1526.

有了fork调用,一个进程在接到新的任务时,就可以复制出一个子进程来处理新任务。常见的Apache服务器就是由父进程监听端口,一旦有新的http请求时,就fork出子进程来处理新的http请求。

再看一个例子:

#coding=utf-8
import os
os.fork()
print 1

执行结果:

1
1

程序中,父进程中创建了一个子进程,子进程运行打印了一个1,回到父进程又打印了一个1,所以结果是打印了2个1。

需要注意的是,上面创建进程的函数都是Unix/Linux下的,Windows下是没有的,那在Windows下又使用什么实现多进程呢?

由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块, 支持子进程、通信和共享数据、执行不同形式的同步。

multiprocessing模块提供了一个Process类来创建一个新的进程对象。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
浅谈Python2.6和Python3.0中八进制数字表示的区别
Apr 28 Python
python 读取excel文件生成sql文件实例详解
May 12 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
Django使用Mysql数据库已经存在的数据表方法
May 27 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
Python列表(list)所有元素的同一操作解析
Aug 01 Python
pywinauto自动化操作记事本
Aug 26 Python
python多继承(钻石继承)问题和解决方法简单示例
Oct 21 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
Python实现微信表情包炸群功能
Jan 28 Python
Django restframework 源码分析之认证详解
Feb 22 #Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 #Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 #Python
python 自动批量打开网页的示例
Feb 21 #Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 #Python
Python利用itchat库向好友或者公众号发消息的实例
Feb 21 #Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 #Python
You might like
php生成QRcode实例
2014/09/22 PHP
PHP构造二叉树算法示例
2017/06/21 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
jQuery 工具函数学习资料
2010/04/29 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
js对象的复制继承实例
2015/01/10 Javascript
JS实现鼠标点击展开或隐藏表格行的方法
2015/03/03 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
vue-router 权限控制的示例代码
2017/09/21 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
Bootstrap4 gulp 配置详解
2019/01/06 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
vue+mock.js实现前后端分离
2019/07/24 Javascript
node静态服务器实现静态读取文件或文件夹
2019/12/03 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
[01:00:35]2018DOTA2亚洲邀请赛3月30日B组 EffcetVSMineski
2018/03/31 DOTA
Python处理XML格式数据的方法详解
2017/03/21 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
python编写简易聊天室实现局域网内聊天功能
2018/07/28 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
基于Django统计博客文章阅读量
2019/10/29 Python
python实现根据给定坐标点生成多边形mask的例子
2020/02/18 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
Lookfantastic法国官网:英国知名美妆购物网站
2017/10/28 全球购物
捷克家居装饰及图书音像购物网站:Velký košík
2018/04/16 全球购物
绿化工程实施方案
2014/03/17 职场文书
单位承诺书格式
2014/05/21 职场文书
群众路线剖析材料(四风问题)
2014/10/08 职场文书
迟到检讨书范文
2015/01/27 职场文书
python实现自动化群控的步骤
2021/04/11 Python
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python
用python画城市轮播地图
2021/05/28 Python