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 ip正则式
May 07 Python
Python实现telnet服务器的方法
Jul 10 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
Apr 20 Python
Python随机数random模块使用指南
Sep 09 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
Jun 25 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
用python写PDF转换器的实现
Oct 29 Python
call在Python中改进数列的实例讲解
Dec 09 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 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文档更新介绍
2011/07/22 PHP
php取得字符串首字母的方法
2015/03/25 PHP
PHP实现链表的定义与反转功能示例
2018/06/09 PHP
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
详解如何修改 node_modules 里的文件
2020/05/22 Javascript
python实现电子词典
2020/04/23 Python
python 转换 Javascript %u 字符串为python unicode的代码
2016/09/06 Python
python监测当前联网状态并连接的实例
2018/12/18 Python
解决python ogr shp字段写入中文乱码的问题
2018/12/31 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
CSS3 input框的实现代码类似Google登录的动画效果
2020/08/04 HTML / CSS
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
酒店应聘自荐信
2013/11/09 职场文书
会计系中文个人求职信
2013/12/24 职场文书
汽车机修工岗位职责
2014/03/06 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
文明礼仪标语
2014/06/13 职场文书
法学自荐信
2014/06/20 职场文书
2014年乡镇领导个人整改措施
2014/09/19 职场文书
大学生暑期社会实践证明范本
2014/10/24 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
学生评语集锦
2015/01/04 职场文书
校长师德表现自我评价
2015/03/04 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
mysql查询结果实现多列拼接查询
2022/04/03 MySQL