Python多进程fork()函数详解

 更新时间:2019年02月22日 08:33:32   作者:世界看我我看世界  
今天小编就为大家分享一篇关于Python多进程fork()函数详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

进程

进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程。进程是系统进行资源分配和调度的一个独立单位。进程是由代码(堆栈段)、数据(数据段)、内核状态和一组寄存器组成。

在多任务操作系统中,通过运行多个进程来并发地执行多个任务。由于每个线程都是一个能独立执行自身指令的不同控制流,因此一个包含多个线程的进程也能够实现进程内多任务的并发执行。

进程是一个内核级的实体,进程结构的所有成分都在内核空间中,一个用户程序不能直接访问这些数据。

进程的状态:

创建、准备、运行、阻塞、结束。

进程间的通信方式可以有:

  • 文件
  • 管道
  • 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修改字典内key对应值的方法

    python修改字典内key对应值的方法

    这篇文章主要介绍了python修改字典内key对应值的方法,涉及Python中字典赋值的相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • python实现图书馆研习室自动预约功能

    python实现图书馆研习室自动预约功能

    这篇文章主要为大家详细介绍了python实现图书馆研习室自动预约功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Python中random模块生成随机数详解

    Python中random模块生成随机数详解

    本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下
    2016-03-03
  • 超实用的 10 段 Python 案例

    超实用的 10 段 Python 案例

    Python是目前最流行的语言之一,它在数据科学、机器学习、web开发、脚本编写、自动化方面被许多人广泛使用。它的简单和易用性造就了它如此流行的原因。今天这篇文章就给大家分享 10 段超级有用的 Python 案例,需要的朋友可以参考一下
    2021-09-09
  • Python基础入门之魔法方法与异常处理

    Python基础入门之魔法方法与异常处理

    在python中,所有以“__"双下划线包起来的方法,都统称为魔法方法,下面这篇文章主要给大家介绍了关于Python基础入门之魔法方法与异常处理的相关资料,需要的朋友可以参考下
    2021-11-11
  • 如何使用pyinstaller打包时引入自己编写的库

    如何使用pyinstaller打包时引入自己编写的库

    这篇文章主要介绍了如何使用pyinstaller打包时引入自己编写的库,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Python使用python-docx读写word文档

    Python使用python-docx读写word文档

    这篇文章主要为大家详细介绍了Python使用python-docx读写word文档,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • python中添加模块导入路径的方法

    python中添加模块导入路径的方法

    这篇文章主要介绍了python中添加模块导入路径的方法 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 详解Python列表解析式的使用方法

    详解Python列表解析式的使用方法

    Python 是一种极其多样化和强大的编程语言!当需要解决一个问题时,它有着不同的方法。本文将将会展示列表解析式的使用方法,需要的可以参考一下
    2022-04-04
  • pyinstaller通过spec文件打包py程序的步骤

    pyinstaller通过spec文件打包py程序的步骤

    这篇文章主要介绍了pyinstaller通过spec文件打包py程序,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05

最新评论