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实现Linux下守护进程的编写方法
Aug 22 Python
python求解水仙花数的方法
May 11 Python
python实现将英文单词表示的数字转换成阿拉伯数字的方法
Jul 02 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Python reduce()函数的用法小结
Nov 15 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
Selenium基于PIL实现拼接滚动截图
Apr 10 Python
Python importlib动态导入模块实现代码
Apr 16 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 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
PHP实现简单数字分页效果
2015/07/26 PHP
可插入图片的TEXT文本框
2013/12/27 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
使用JavaScript实现旋转的彩圈特效
2015/06/23 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
jQuery UI Bootstrap是什么?
2016/06/17 Javascript
jQuery插件JWPlayer视频播放器用法实例分析
2017/01/11 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
JS中判断某个字符串是否包含另一个字符串的五种方法
2018/05/03 Javascript
详解vue中localStorage的使用方法
2018/11/22 Javascript
spring+angular实现导出excel的实现代码
2019/02/27 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
浅谈Node新版本13.2.0正式支持ES Modules特性
2019/11/25 Javascript
vue项目实现图片上传功能
2019/12/23 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
python登录并爬取淘宝信息代码示例
2017/12/09 Python
Django进阶之CSRF的解决
2018/08/01 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
2019/07/06 Python
Python实现不规则图形填充的思路
2020/02/02 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
如何基于python实现不邻接植花
2020/05/01 Python
python利用线程实现多任务
2020/09/18 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
HTML5中的Web Notification桌面通知功能的实现方法
2019/07/29 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
装潢设计实习自我鉴定
2013/09/19 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
合作意向书模板
2014/03/31 职场文书
推荐信怎么写
2014/05/09 职场文书
小学师德师风演讲稿
2014/09/02 职场文书