名词解释:

进程: 一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配和调度运行的基本单位
1. 并行
在某个*时间点*,两件或两件以上的事件(任务)同时执行.
比如说,有三条车道,某个时刻,有三辆车同时在这三个车道上跑.
2. 并发
在某个*时间段*内,两件或两件以上的事件(任务),轮流交替使用某一资源,目的是提高效率.
比如说,有一条单行车道,允许一辆车通过,有A,B两辆车要通过单行道,那么只有当A或B先通过后,另一辆车才能启动通过该单行道.
并行并发区别:
并行是从微观上,在某一具体的时间点,有不同的程序在执行,这就要求系统又多个处理器(多核).
并发是从宏观上,在一个时间段上来看,是同时执行的;但从微观上来说,相当于串行(宏观上*并行*,微观上*串行*)
 
3. 同步
一个任务的完成需要依赖另一个任务,只有被依赖的任务完成后,依赖的任务才能算完成.这两个任务,要么都成功,要么都失败,状态可以保持一致.
举例:
A和B两个任务,A任务执行过程中需要调用B任务,调用B任务后,需要等待B的响应结果(B给出明确的反馈返回给A),如果A没有收到B的响应,A会一直等待,不会继续向下执行,只有B返回响应结果给A后,A任务才会继续向下执行.
4. 异步
一个任务的完成不需要等待被依赖的任务完成,只是通知被依赖的任务需要做什么,通知完之后,依赖任务会继续向下执行,自己完成了,整个任务就算完成.
举例:
A任务执行过程中可能需要调用B,C,D等其他任务,在调用B,C,D等其他任务后,A不需要等待它们的返回结果,只是简单的调用,其他任务的执行结果或情况与A无关,A只是把消息或指令传给它们,A会继续向下执行,A执行完成,任务就算完成了.
银行的转账系统,对数据库的保存操作等等,会使用同步交互操作,其余情况优先使用异步交互操作
Java中的同步和异步两种交互方式
同步交互: 指发送一个请求,需要等待返回,然后才能发送下一个请求,有个等待过程;
异步交互: 指发送一个请求,不需要等待返回,随时可以发送下一个请求,即不需要等待.
阻塞,非阻塞:
概念: 程序等待调用结果时的状态
5. 阻塞
调用结果返回之前,执行线程会被挂起,不释放cpu执行权,线程不能做其他事情,只能等待,只有等到调用结果返回了,才能接着往下执行.
6. 非阻塞
在没有获取调用结果时,不是一直等待,线程可以往下执行,如果是同步的,通过轮询的方式检查调用结果有没有返回,如果是异步的,会通知回调.
7. 守护进程
运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。

执行代码

1. 建立开启子进程两种方式

from multiprocessing import Process
import os
import time # 开启子进程的两种方式
# 方式1
def run(num):
print('子进程%s执行,进程id:%s' % (num, os.getpid()))
time.sleep(1.5)
print('子进程%s结束,进程id:%s' % (num, os.getpid())) if __name__ == '__main__':
print('父进程执行,进程id:%s' % os.getpid())
for i in range(3):
p = Process(target=run, args=(i,))
p.start()
print('父进程结束,进程id:%s' % os.getpid()) # 进程代码逐行读取,主进程不会等待子进程结束(主进程,子进程异步)
# 执行结果
父进程执行,进程id:4472
子进程0执行,进程id:4473
父进程结束,进程id:4472
子进程1执行,进程id:4474
子进程2执行,进程id:4475
子进程0结束,进程id:4473
子进程1结束,进程id:4474
子进程2结束,进程id:4475 # 方式2,继承Process类
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name def run(self):
print('子进程%s,进程id:%s' % (self.name, os.getpid())) if __name__ == '__main__':
print('父进程开始')
p = MyProcess('jason')
p.start() # 自动触发调用类中的run方法
p.join()
print('父进程结束')
# 执行结果
父进程开始
子进程jason,进程id:4486
父进程结束

2. 进程的常用方法

# p.start(); p.join(); p.is_alive(); p.terminate()
def func():
print('测试进程中常用方法') if __name__ == '__main__':
p = Process(target=func,)
p.start() # 开启一个进程
p.terminate() # 杀掉一个进程
print(p.is_alive()) # 判断进程是否还存活
p.join() # 等待进程结束,再继续向下执行;异步变同步
print(p.is_alive())
print('父进程结束')
# 执行结果
True
False
父进程结束

3. 进程的属性

# p.name; p.pid; p.daemon = True(将进程p变为守护进程,daemon默认为False)
def func():
n = 1
while n:
time.sleep(1)
print('测试进程的属性--%s' % n)
n += 1 if __name__ == '__main__':
p = Process(target=func,)
p.daemon = True # 子进程变为守护进程; 守护进程会随着父进程的结束而结束; 守护进程不能创建子进程
p.start()
print(p.name) # 获取子进程名
print(p.pid) # 获取进程ID
time.sleep(5)
print('父进程结束')
# 执行结果
Process-1
4512
测试进程的属性--1
测试进程的属性--2
测试进程的属性--3
测试进程的属性--4
父进程结束

Python-进程相关概念的更多相关文章

  1. [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]

    [操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...

  2. python——进程基础

    我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...

  3. 使用gdb调试Python进程

    使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...

  4. python进程、线程、协程(转载)

    python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资 ...

  5. Python进程、线程、协程详解

    进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. ...

  6. python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

  7. python——进程、线程、协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...

  8. python/进程线程的总结

    python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...

  9. python 进程介绍 进程简单使用 join 验证空间隔离

    一.多道程序设计技术(详情参考:https://www.cnblogs.com/clschao/articles/9613464.html) 所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行 ...

  10. Python 进程之间共享数据

    最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享  在mp库当中,跨进程对象共享有三种方式,第一种 ...

随机推荐

  1. 关于 MySQL查询当天、本周,本月,上一个月的数据

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  2. ctpn+crnn 训练数据集生成

    1. https://github.com/Belval/TextRecognitionDataGenerator 2. https://textrecognitiondatagenerator.re ...

  3. Python笔记_类

    1.类 1.1 类的定义 # 类的定义 class 类名: pass # pass是空语句,不具有任何意义,仅为了保持程序结构完整性 # 创建对象 对象名 = 类名() 1.2 成员变量 # 成员变量 ...

  4. Windows Server - SVN 服务器搭建与项目配置、客户端安装与配置

    本教程以Windows Server 2012 R12 为例搭建SVN服务器,安装部署完成后,客户端可通过SVN客户端访问SVN服务器上的项目,也可以访问网上其他SVN服务器上的项目. 一.首先准备三 ...

  5. Android自动化测试探索(五)代码覆盖率统计

    Android 代码覆盖率统计 本周开始准备统计Android自动化用例的代码覆盖率,将最终使用的方法记录下来. 覆盖率监测的原理 覆盖率监测的原理跟iOS上的原理差不多,大致的思路参考下吧, iOS ...

  6. Python中yield解析

    小探yield 查看 python yield 文档 yield expressions: Using a yield expression in a function's body causes t ...

  7. BZOJ2152 聪聪可可 (点分治)

    2152: 聪聪可可 题意: 在一棵边带权的树中,问任取两个点,这两个点间的权值和是3的倍数的概率. 思路: 经典的点分治题目. 利用点分治在计算所有路径长度,把路径长度对3取模,用t[0],t[1] ...

  8. 线段树离散化 unique + 二分查找 模板 (转载)

    离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率. 通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小.例如: 原数据:1,999,100000,15:处理 ...

  9. AC自动机 建立nlogn个AC自动机

    String Set Queries 题意:给你3种操作,1.加入一个串到集合中. 2.删除集合中的某一个串 3.查询集合中的字符串在给定的字符串种出现几次.(同一个串可重复) 解法:建立多个AC自动 ...

  10. codeforces 814 C. An impassioned circulation of affection(二分+思维)

    题目链接:http://codeforces.com/contest/814/problem/C 题意:给出一串字符串然后q个询问,问替换掉将m个字符替换为字符c,能得到的最长的连续的字符c是多长 题 ...