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的Django框架中创建语言文件
Jul 27 Python
python 表达式和语句及for、while循环练习实例
Jul 07 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
Apr 25 Python
python3.6编写的单元测试示例
Aug 17 Python
django 数据库连接模块解析及简单长连接改造方法
Aug 29 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
Pytorch之contiguous的用法
Dec 31 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
在Python中字典按值排序的实现方法
Nov 12 Python
详解python中的三种命令行模块(sys.argv,argparse,click)
Dec 15 Python
python中numpy.empty()函数实例讲解
Feb 05 Python
python图片灰度化处理的几种方法
Jun 23 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发送AT指令实例代码
2016/05/26 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
2018/04/20 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
JavaScript创建命名空间(namespace)的最简实现
2007/12/11 Javascript
DWR Ext 加载数据
2009/03/22 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
Javascript解析URL方法详解
2014/12/05 Javascript
javascript表单验证和Window详解
2014/12/11 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
jquery删除指定子元素代码实例
2015/01/13 Javascript
jQuery统计上传文件大小的方法
2015/01/24 Javascript
js实现按钮控制图片360度翻转特效的方法
2015/02/17 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
layui.tree组件的使用以及搜索节点功能的实现
2019/09/26 Javascript
python利用sklearn包编写决策树源代码
2017/12/21 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
python如何求解两数的最大公约数
2018/09/27 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
python网络应用开发知识点浅析
2019/05/28 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
详解一种用django_cache实现分布式锁的方式
2019/09/01 Python
关于Python解包知识点总结
2020/05/05 Python
python实现图像外边界跟踪操作
2020/07/13 Python
学python爬虫能做什么
2020/07/29 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
阳光体育活动总结
2014/04/30 职场文书
项目经理任命书内容
2014/06/06 职场文书
单位法定代表人授权委托书
2014/09/20 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
物资采购管理制度
2015/08/06 职场文书