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


猜你喜欢
- jwt详解Django之auth模块(用户认证)jwt的作用json web token,一般用于用户认证就是做用户登录的(前后端分离/微信
- 现在算法是大厂面试的必考题,而且越来越难,已经不是简单的列表,字符串操作了,会涉及到各种数据结结构。单链表的反转也是经常考的一道题,里面故在
- global.asa<SCRIPT LANGUAGE="VBScript" RUNAT=&qu
- asp函数实现把数字格式化为每3个数字时以逗号间隔的数字见下:<%Function Comma(str)If No
- 使用axios发送post请求出现400错误出现400状态码主要有两种原因1.bad request:“错误的请求&qu
- 简单使用csv.DictReader()方法示例代码1:import csvf = open('sample','r
- 一、使用replace+空格ordersdetaildf['商品名称2']=ordersdetaildf['商品名称
- 本文实例讲述了Vue插槽原理与用法。分享给大家供大家参考,具体如下:1 插槽内容Vue 实现了一套内容分发的 API,这套 API 基于当前
- <% &nbs
- 一、进程介绍进程:正在执行的程序,由程序、数据和进程控制块组成,是正在执行的程序,程序的一次执行过程,是资源调度的基本单位。程序:没有执行的
- 方法1:cmd环境下,用pip install selenium可能会很慢方法2:下载selenium安装包手动安装下载地址:https:/
- 看代码吧~package mainimport ("fmt""io""net/http&q
- 前言最近在爬行 nosec.org 的数据,看了下需要模拟登录拿到cookie后才能访问想抓的数据,重要的是 nosec.org 的登录页面
- 调试的定义:通过一定方法,在程序中找到并减少缺陷的数量,从而使其能正常工作。这里说一些如何调试PHP程序的经验。一、PHP自带的调试功能1、
- 本文实例讲述了PHP判断密码强度的方法。分享给大家供大家参考,具体如下:一、php页面$score = 0;if(!empty($_GET[
- 场景描述在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found wh
- 1. lr_scheduler相关lr_scheduler = WarmupLinearSchedule(optimizer, warmup
- 前言本篇来学习下柱状图的实现柱状图实现步骤ECharts 最基本的代码结构准备x轴的数据准备 y 轴的数据准备 option , 将 ser
- provide / inject 是 2.2 新增的方法,可以以一个祖先组件向所有子孙后代注入依赖(一个内容)。provider/injec
- 关于英文的写作有一本十分著名的书,The Elements of Style(风格要素),编写程序也有一本The Elements of P