Python多进程fork()函数详解

作者:世界看我我看世界 时间:2023-06-08 19:41:37 

进程

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

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

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

进程的状态:

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

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

  • 文件

  • 管道

  • 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类来创建一个新的进程对象。

来源:https://blog.csdn.net/SeeTheWorld518/article/details/49639247

标签:python,多进程,fork(),函数
0
投稿

猜你喜欢

  • python中mediapipe库踩过的坑实战记录

    2021-03-07 13:32:47
  • PHP date()格式MySQL中插入datetime方法

    2024-05-13 09:51:39
  • google广告之另类js调用实现代码

    2024-05-11 09:44:21
  • Python 读写文件和file对象的方法(推荐)

    2022-01-09 08:36:03
  • python logging设置level失败的解决方法

    2022-03-23 13:54:40
  • python爬虫入门教程--HTML文本的解析库BeautifulSoup(四)

    2023-08-12 23:45:10
  • 基于python爬取有道翻译过程图解

    2021-11-03 23:57:27
  • python光学仿真面向对象光学元件类的实现

    2022-10-11 19:45:06
  • 专家教你安装 MySQL的与MySQL GUI Tools

    2012-01-29 17:59:05
  • Python常用时间操作总结【取得当前时间、时间函数、应用等】

    2021-01-12 20:32:33
  • python 异步async库的使用说明

    2022-03-03 20:37:01
  • python中 ? : 三元表达式的使用介绍

    2022-07-30 00:29:44
  • asp是什么格式 asp文件用什么打开

    2020-06-30 16:04:48
  • pandas 如何将字符串映射为数字

    2021-04-15 02:47:33
  • 在js中调用asp页面的方法

    2007-08-21 20:30:00
  • 深入C++ string.find()函数的用法总结

    2024-01-13 05:21:48
  • Python文件操作之二进制文件详解

    2021-10-23 16:44:47
  • pytorch程序异常后删除占用的显存操作

    2021-04-03 22:33:38
  • Vue中如何优雅的捕获 Promise 异常详解

    2023-07-02 16:56:14
  • MySql带OR关键字的多条件查询语句

    2024-01-21 22:39:25
  • asp之家 网络编程 m.aspxhome.com