关于对python中进程的几个概念理解

目录
  • 进程
  • 僵尸进程
  • 孤儿进程
  • 守护进程
  • 互斥锁
  • 总结

进程

第一,进程是一个容器。每一个进程都有它自己的地址空间,一般情况下,包括文本区域( text region)、数据区域(data region)和堆栈(stack region)。
文本区域存储处理器执行的代码;数据区城存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储看活动过程调用的指令和本地变量。

第二,进程是一个"执行中的程序"。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才 能成为一个活动的实体,我们称其为进程。

第三,进程是操作系统中最基本、重要的概念。是多道程序系统岀现后,为了刻圓系统內部出现的 动态情况,箍述系统內部眢道程序的活动规律引进的一个概念,所有多道程序设计搡作系统都建立在进程的基础上。

本文为了说明例子,用中文作为变量写在了程序里面,一般编程最好不要那么写

僵尸进程

僵尸进程是当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源

我们都知道进程的工作原理。我们启动一个程序,开始我们的任务,然后等任务结束了,我们就停止这个进程。 进程停止后, 该进程就会从进程表中移除。

你可以通过 System-Monitor 查看当前进程。

In UNIX System terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在UNIX 系统中,一个进程结束了,但是他的父进程没有等待(调用wait / waitpid)他, 那么他将变成一个僵尸进程。 但是如果该进程的父进程已经先结束了,那么该进程就不会变成僵尸进程, 因为每个进程结束的时候,系统都会扫描当前系统中所运行的所有进程, 看有没有哪个进程是刚刚结束的这个进程的子进程,如果是的话,就由Init 来接管他,成为他的父进程

孤儿进程

在操作系统领域中,孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

代码示例

from multiprocessing import Process
import time

def 要运行的函数():
    print('我是子进程A')
    time.sleep(5)
    print('我是子进程B')

if __name__ == '__main__':
    p = Process(target=要运行的函数)
    p.start()
    print('我是主进程')

效果

守护进程

守护进程是一个在后台运行并且不受任何终端控制的进程。Unix操作系统有很多典型的守护进程(其数目根据需要或20—50不等),它们在后台运行,执行不同的管理任务。

用户使守护进程独立于所有终端是因为,在守护进程从一个终端启动的情况下,这同一个终端可能被其他的用户使用。例如,用户从一个终端启动守护进程后退出,然后另外一个人也登录到这个终端。用户不希望后者在使用该终端的过程中,接收到守护进程的任何错误信息。同样,由终端键入的任何信号(例如中断信号)也不应该影响先前在该终端启动的任何守护进程的运行。虽然让服务器后台运行很容易(只要shell命令行以&结尾即可),但用户还应该做些工作,让程序本身能够自动进入后台,且不依赖于任何终端。

守护进程没有控制终端,因此当某些情况发生时,不管是一般的报告性信息,还是需由管理员处理的紧急信息,都需要以某种方式输出。Syslog 函数就是输出这些信息的标准方法,它把信息发送给 syslogd 守护进程。

代码实现

from multiprocessing import Process
import time

def 要运行的函数(变量):
    print('%s负责剥削的资本家正在运行'% 变量)
    time.sleep(3)
    print('%s负责剥削的资本家正在终止' % 变量)

if __name__ == '__main__':
    A = Process(target=要运行的函数,args=('资本家',))

    A.daemon = True  # 将进程A设置成守护进程  本行代码要放在start方法上面才有效,否则会报错
    A.start()
    print('剥削的资本家被终止了')

效果

互斥锁

在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

比如,一群人中,出现了一个工贼,但是,人们觉得用拳头不爽,但是狼牙棒只有一个,于是大家要开始抢狼牙棒,我们就对狼牙棒上一个互斥锁

代码实现

from multiprocessing import Process, Lock
import json
import time
import random

# 查狼牙棒
def search(i):
    # 文件操作读取狼牙棒数
    with open('data','r',encoding='utf8') as f:
        dic = json.load(f)
    print('群众%s想要获取余狼牙棒:%s'%(i, dic.get('狼牙棒_num')))
    # 字典取值不能用[]的形式 应该使用get,即使函数不能运行也要写个pass上去,这是为了避免因为小问题导致整个程序无法运行的情况

# 抢狼牙棒  1.先查 2.再抢
def buy(i):
    # 先查狼牙棒
    with open('data.txt','r',encoding='utf8') as f:
        dic = json.load(f)
    # 模拟网络延迟
    time.sleep(random.randint(1,5))#每个人的手速不同
    # 判断当前是否有狼牙棒
    if dic.get('狼牙棒_num') > 0:
        # 修改数据库 抢狼牙棒
        dic['狼牙棒_num'] -= 1
        # 写入数据库
        with open('data.txt','w',encoding='utf8') as f:
            json.dump(dic,f)
        print('群众%s抢狼牙棒成功'%i)
    else:
        print('群众%s抢狼牙棒失败'%i)

# 整合上面两个函数
def run(i, mutex):
    search(i)
    # 给狼牙棒环节加锁处理
    # 抢锁
    mutex.acquire()

    buy(i)
    # 释放锁
    mutex.release()

if __name__ == '__main__':
    # 在主进程中生成一把锁 让所有的子进程抢
    mutex = Lock()
    for i in range(1,11):
        p = Process(target=run, args=(i, mutex))
        p.start()

效果

文件格式

总结

到此这篇关于对python中进程的几个概念理解的文章就介绍到这了,更多相关python进程概念理解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python控制多进程与多线程并发数总结

    一.前言 本来写了脚本用于暴力破解密码,可是1秒钟尝试一个密码2220000个密码我的天,想用多线程可是只会一个for全开,难道开2220000个线程吗?只好学习控制线程数了,官方文档不好看,觉得结构不够清晰,网上找很多文章也都不很清晰,只有for全开线程,没有控制线程数的具体说明,最终终于根据多篇文章和官方文档算是搞明白基础的多线程怎么实现法了,怕长时间不用又忘记,找着麻烦就贴这了,跟我一样新手也可以参照参照. 先说进程和线程的区别: 地址空间:进程内的一个执行单元;进程至少有一个线程;它们共

  • Python进程间通信之共享内存详解

    前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现.查了一下,Python中可以使用mmap模块来实现这一功能. Python中的mmap模块是通过映射同一个普通文件实现共享内存的.文件被映射到进程地址空间后,进程可以像访问内存一样对文件进行访问. 不过,mmap在linux和windows上的API有些许的不一样,具体细节可以查看mmap的文档. 下面看一个例子:

  • python实现进程间通信简单实例

    本文实例讲解了python实现两个程序之间通信的方法,具体方法如下: 该实例采用socket实现,与socket网络编程不一样的是socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)的第一个参数是socket.AF_UNIX 而不是 socket.AF_INET 例中两个python程序 s.py/c.py 要先运行s.py 基于fedora13/python2.6测试,成功实现! s.py代码如下: #!/usr/bin/env python im

  • 简单谈谈python中的Queue与多进程

    最近接触一个项目,要在多个虚拟机中运行任务,参考别人之前项目的代码,采用了多进程来处理,于是上网查了查python中的多进程 一.先说说Queue(队列对象) Queue是python中的标准库,可以直接import 引用,之前学习的时候有听过著名的"先吃先拉"与"后吃先吐",其实就是这里说的队列,队列的构造的时候可以定义它的容量,别吃撑了,吃多了,就会报错,构造的时候不写或者写个小于1的数则表示无限多 import Queue q = Queue.Queue(10

  • Python实现多进程的四种方式

    方式一: os.fork() # -*- coding:utf-8 -*- """ pid=os.fork() 1.只用在Unix系统中有效,Windows系统中无效 2.fork函数调用一次,返回两次:在父进程中返回值为子进程id,在子进程中返回值为0 """ import os pid=os.fork() if pid==0: print("执行子进程,子进程pid={pid},父进程ppid={ppid}".format

  • 关于对python中进程的几个概念理解

    目录 进程 僵尸进程 孤儿进程 守护进程 互斥锁 总结 进程 第一,进程是一个容器.每一个进程都有它自己的地址空间,一般情况下,包括文本区域( text region).数据区域(data region)和堆栈(stack region). 文本区域存储处理器执行的代码;数据区城存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储看活动过程调用的指令和本地变量. 第二,进程是一个"执行中的程序".程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才 能成为一个

  • Python中进程和线程的区别详解

    Num01–>线程 线程是操作系统中能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. 一个线程指的是进程中一个单一顺序的控制流. 一个进程中可以并发多条线程,每条线程并行执行不同的任务. Num02–>进程 进程就是一个程序在一个数据集上的一次动态执行过程. 进程有以下三部分组成: 1,程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成. 2,数据集:数据集则是程序在执行过程中需要的资源,比如图片.音视频.文件等. 3,进程控制块:进程控制块是用来记录进程的外部

  • Python中requests库的基本概念与具体使用方法

    目录 一. 基本概念 1. 简介 2. 获取 3. http 协议 3.1 URL 3.2 常用 http 请求方法 二. 使用方法 1. 基本语法 2. 具体使用方法 2.1 get 2.2 post 2.3 response 2.4 head 2.5 put 总结 一. 基本概念 1. 简介 requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测

  • 简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象

  • Python中的模块和包概念介绍

    模块概述 如果说模块是按照逻辑来组织 Python 代码的方法, 那么文件便是物理层上组织模块的方法. 因此, **一个文件被看作是一个独立模块, 一个模块也可以被看作是一个文件. 模块的文件名就是模 块的名字加上扩展名 .py . 与其它可以导入类(class)的语言不同,在 Python 中你导入的是模块或模块属性**. 模块名称空间 一个名称空间就是一个名称到对象的关系映射. 导入模块 导入模块整体(import) 方式一 复制代码 代码如下: import module1 import

  • 对python中return和print的一些理解

    前言 最近刚开始学习python,之前只有一些c的基础,也忘得差不多了,现在想边学习边总结和分享收获~看书时看了return的用法,可是后来和print混了,老是感觉可以将函数return值直接显示,但不是这样的.下面就来和大家分析下对python中return和print的理解,话不多说了,来一起看看详细的介绍吧. 看到知道上的一个例子: 代码 (1) x = 1 y = 2 def add (x, y): z = x + y return z print (add(x,y)) 代码 (2)

  • 关于Python中*args和**kwargs的深入理解

    目录 1. 理解  *  和  ** 2.Python函数的参数 3. 支持任意参数的函数 *args, **kwargs 4. 固定位置参数和关键字参数  /   * 5. **的另一个用法, 字典合并 总结: 1. 理解  *  和  ** Python的赋值语句可以解包将可迭代元素剥离出来 In [6]: a, b, c = [1, 2, 3] In [7]: a Out[7]: 1 In [8]: b Out[8]: 2 In [9]: c Out[9]: 3 赋值语句可以理解为 a,

  • Python中装饰器的基本功能理解

    目录 前言 什么是装饰器 Python 函数的基本特性 函数名的本质: 将函数作为变量使用: 进一步实现装饰器 使用Python装饰器语句: 总结 前言 在 python 中,装饰器由于是 python 语言自带的一个功能,因此,对于其实现以及其用法就会感到比较奇怪,这里我记录一下对它的理解,加深自己的印象. 什么是装饰器 对于什么是装饰器,我们其实应该知道为什么会存在装饰器. ​ 装饰器是 python 引入的一个非常有意思的功能,它主要用于解决想要在原有函数或类的基础上进行功能扩展,但又不会

  • python中的decode()与encode()深入理解

    目录 1.decode() 2.encode() 3.转码 unicode编码方案:unicode只规定了每个字符所对应的码值(码点),即编码,但并没有规定如何在计算机中实现.同一个字符,可通过utf-8.utf-16.utf-32.gb2312(对中文)等多种方式各自实现.encode()方法就是将unicode编码方式转化为对应的实现方式,而decode()相反,将实现方式转化为编码. 1.decode() bytes.decode(encoding=“utf-8”, errors=“str

  • python中对开区间和闭区间的理解

    目录 对开区间和闭区间的理解 举例 开闭区间易混点 1.range和random模块区别 2.第二点 对开区间和闭区间的理解 对于开区间,本身已经不包含两端点值,所以根本满足不了连续的第一个要求,所以要说某一开区间连续,我们说是函数在这一开区间内连续,区间内当然不包括端点,只要证明得了函数在开区间内每一处都连续,那么就可以得证该函数在该开区间内连续: 而证明函数在一闭区间内连续,显然除了两端点之间连续要证明,两端点处也要证明. 也就是说闭区间连续的证明比开区间多了一步——两端点的连续证明. 在已

随机推荐