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 相关文章推荐
python模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
python简单文本处理的方法
Jul 10 Python
浅谈Django学习migrate和makemigrations的差别
Jan 18 Python
使用Django和Python创建Json response的方法
Mar 26 Python
python自动发送邮件脚本
Jun 20 Python
Python3中在Anaconda环境下安装basemap包
Oct 21 Python
python实现一组典型数据格式转换
Dec 15 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
python实现简单图片物体标注工具
Mar 18 Python
pandas读取CSV文件时查看修改各列的数据类型格式
Jul 07 Python
Python3自定义http/https请求拦截mitmproxy脚本实例
May 11 Python
详解python 条件语句和while循环的实例代码
Dec 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
PHP新手上路(十二)
2006/10/09 PHP
PHP服务器页面间跳转实现方法
2012/08/02 PHP
fetchAll()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
php+croppic.js实现剪切上传图片功能
2018/08/14 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
js插件设置innerHTML时在IE8下提示“未知运行时错误”解决方法
2015/04/25 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
微信小程序 loading(加载中提示框)实例
2016/10/28 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
2017/07/13 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析
2019/03/06 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
基于JavaScript 实现拖放功能
2019/09/12 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
Python 函数list&read&seek详解
2019/08/28 Python
python获取本周、上周、本月、上月及本季的时间代码实例
2020/09/08 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
详解HTML5 Canvas标签及基本使用
2020/01/10 HTML / CSS
十八大报告观后感
2014/01/28 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
李开复演讲稿
2014/05/24 职场文书
任命书范本大全
2014/06/06 职场文书
开展读书活动总结
2014/06/30 职场文书
建议书范文
2015/02/05 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
动画《朋友游戏》公开佐藤友生绘制的开播纪念绘
2022/04/06 日漫