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 socket 超时设置 errno 10054
Jul 01 Python
Python的垃圾回收机制深入分析
Jul 16 Python
Python使用SocketServer模块编写基本服务器程序的教程
Jul 12 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
python抓取文件夹的所有文件
Feb 27 Python
python抽取指定url页面的title方法
May 11 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
python画折线图的程序
Jul 26 Python
攻击者是如何将PHP Phar包伪装成图像以绕过文件类型检测的(推荐)
Oct 11 Python
在VS2017中用C#调用python脚本的实现
Jul 31 Python
python 使用shutil复制图片的例子
Dec 13 Python
Python生成器next方法和send方法区别详解
May 30 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
php中常用编辑器推荐
2007/01/02 PHP
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
php创建图像具体步骤
2017/03/13 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
解javascript 混淆加密收藏
2009/01/16 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2011/09/13 Javascript
javascript中简单的进制转换代码实例
2013/10/26 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
javascript中checkbox使用方法实例演示
2015/11/19 Javascript
Angular2 之 路由与导航详细介绍
2017/05/26 Javascript
jQuery.Sumoselect插件实现下拉复选框效果
2017/11/09 jQuery
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
2020/03/16 Javascript
[01:56]无止竞 再出发——中国军团出征2017年DOTA2国际邀请赛
2017/07/05 DOTA
Python的垃圾回收机制深入分析
2014/07/16 Python
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
python模块简介之有序字典(OrderedDict)
2016/12/01 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
用python制作个音乐下载器
2021/01/30 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
金宝贝童装官网:Gymboree
2016/08/31 全球购物
Marc Jacobs官方网站:美国奢侈品牌
2017/08/29 全球购物
法警的竞聘演讲稿
2014/01/02 职场文书
移风易俗倡议书
2014/04/15 职场文书
个人课题方案
2014/05/08 职场文书
保护环境建议书作文300字
2015/09/14 职场文书
传单、海报早OUT了,另类传单营销方案送给你!
2019/07/15 职场文书
如何利用python创作字符画
2022/06/25 Python