## 进程及并发的产生

```python
进程指的是正在运行的程序,是一系列过程的统称,也是操作系统在调度和进行资源分配的基本单位
并发,指的是多个任务同时被执行,并发编程指的是编写支持多任务并发的应用程序在。(看似同时执行,因为cpu得任务切换很快)
'并行:是真正意义上的多任务同时被执行。
'进程这个概念来自于操作系统,没有操作系统就没有进程
# 操作系统的两个核心作用
1.为用户屏蔽了复杂繁琐的硬件接口,为应用程序提供了,清晰易用的系统接口
有了这些接口以后程序员不用再直接与硬件打交道了
2.操作系统将应用程序对硬件资源的竞争变成有序的使用
# 操作系统与应用程序的区别
二者的区别不在于的地位,它们都是软件,而操作系统可以看做一款特殊的软件
1.操作系统是是受保护的:无法被用户修改(应用软件如qq不属于操作系统可以随便卸载)
2.大型:linux或widows源代码都在五百万行以上,这仅仅是内核,不包括用户程序,如GUI,库以及基本应用软件(如windows Explorer等),很容易就能达到这个数量的10倍或者20倍之多
3.长寿:由于操作系统源码量巨大,编写是非常耗时耗力的,一旦完成,操作系统所有者便不会轻易的放弃重写,二是在原有基础上改进,基本上可以把windows95/98/Me看出一个操作系统第三代计算机产生了多道技术
多进程实现得原理:多道技术
多道技术:1,空间上得复用 2,时间上的复用```## PID禾PPID

```python
# PID
在一个操作系统中通常都会运行多个应用程序,也就是多个进程,那么如何来区分进程呢?
系统会给每一个进程分配一个进程编号即PID,如同人需要一个身份证号来区分。
验证:
tasklist 用于查看所有的进程信息
taskkill  /f /pid  pid 该命令可以用于结束指定进程# 在python中可以使用os模块来获取pid
import os
print(os.getpid())
# PPID
当一个进程a开启了另一个进程b时,a称为b的父进程,b称为a的子进程
在python中可以通过os模块来获取父进程的pid
# 在python中可以使用os模块来获取ppid
import os
print("self",os.getpid()) # 当前进程自己的pid
print("parent",os.getppid()) # 当前进程的父进程的pid

如果是在pycharm中运行的py文件,那pycahrm就是这个python.exe的父进程,当然你可以从cmd中来运行py文件,那此时cmd就是python.exe的父进程```## 阻塞与非阻塞

```python
# 阻塞与非阻塞指的是程序的状态
阻塞状态是因为程序遇到了IO操作,或是sleep,导致后续的代码不能被CPU执行
非阻塞与之相反,表示程序正在正常被CPU执行
补充:进程有三种状态
就绪态,运行态,和阻塞态多道技术会在进程执行时间过长或遇到IO时自动切换其他进程,意味着IO操作与进程被剥夺CPU执行权都会造成进程无法继续执行
```## python中实现多进程的两种方式### 方式1:### 实例化Process类

```python
from multiprocessing import Process
import time
def task(name):print('%s is running' %name)time.sleep(3)print('%s is done' %name)
if __name__ == '__main__':# 在windows系统之上,开启子进程的操作一定要放到这下面# Process(target=task,kwargs={'name':'egon'})p=Process(target=task,args=('jack',))p.start() # 向操作系统发送请求,操作系统会申请内存空间,然后把父进程的数据拷贝给子进程,作为子进程的初始状态print('======主')
```### 方式2:### 继承Process类 并覆盖run方法

```python
from multiprocessing import Process
import timeclass MyProcess(Process):def __init__(self,name):super(MyProcess,self).__init__()self.name=namedef run(self):print('%s is running' %self.name)time.sleep(3)print('%s is done' %self.name)
if __name__ == '__main__':p=MyProcess('jack')p.start()print('主')```需要注意的是 1.在windows下 开启子进程必须放到`__main__`下面,因为windows在开启子进程时会重新加载所有的代码造成递归创建进程(发生了导入)2.第二种方式中,必须将要执行的代码放到run方法中,子进程只会执行run方法其他的一概不管### join函数

调用start函数后的操作就由操作系统来玩了,至于何时开启进程,进程何时执行,何时结束都与应用程序无关,所以当前进程会继续往下执行,join函数就可以是父进程等待子进程结束后继续执行案例```python
from multiprocessing import Process
import time
x=1000
def task():time.sleep(3)global xx=0print('儿子死啦',x)
if __name__ == '__main__':p=Process(target=task)p.start()p.join() # 让父亲在原地等print(x)```## Process对象常用属性

```PYTHON
from multiprocessing import Process
def task(n):print('%s is runing' %n)time.sleep(n)if __name__ == '__main__':start_time=time.time()p1=Process(target=task,args=(1,),name='任务1')p1.start() # 启动进程print(p1.pid) # 获取进程pidprint(p1.name) # 获取进程名字p1.terminate() # 终止进程p1.join() # 提高优先级print(p1.is_alive()) # 获取进程的存活状态print('主')```# 孤儿进程与僵尸进程(了解)#### 什么是孤儿进程

孤儿进程指的是开启子进程后,父进程先于子进程终止了,那这个子进程就称之为孤儿进程例如:qq聊天中别人发给你一个链接,点击后打开了浏览器,那qq就是浏览器的父进程,然后退出qq,此时浏览器就成了孤儿进程孤儿进程是无害的,有其存在的必要性,在父进程结束后,其子进程会被操作系统接管。#### 什么是僵尸进程

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

由于子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束. 那么会不会因为父进程太忙来不及wait子进程,或者说不知道 子进程什么时候结束,而丢失子进程结束时的状态信息呢? 不会。因为UNⅨ提供了一种机制可以保证只要父进程想知道子进程结束时的状态信息, 就必然可以得到。这种机制就是: 在每个进程退出的时候,内核释放该进程所有的资源,包括打开的文件,占用的内存等。但是仍然为其保留一定的信息(包括进程号the process ID,退出状态the termination status of the process,运行时间the amount of CPU time taken by the process等)。直到父进程通过wait / waitpid来取时才释放. 但这样就导致了问题,如果进程不调用wait / waitpid的话,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生[僵死进程],将因为没有可用的进程号而导致系统不能产生新的进程. 此为僵尸进程的危害,应当避免。

转载于:https://www.cnblogs.com/huhongpeng/p/10960252.html

Python day 34 并发编程、PID/PPID、实现多进程得两种方式相关推荐

  1. 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition

    Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...

  2. python 并发执行命令_python: 多线程实现的两种方式及让多条命令并发执行

    一 概念介绍 Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading. ...

  3. 获取Executor提交的并发执行的任务返回结果的两种方式/ExecutorCompletionService使用...

    当我们通过Executor提交一组并发执行的任务,并且希望在每一个任务完成后能立即得到结果,有两种方式可以采取: 方式一: 通过一个list来保存一组future,然后在循环中轮训这组future,直 ...

  4. 高并发编程-Thread_正确关闭线程的三种方式

    文章目录 概述 stop() Deprecated 方式一 设置开关 方式二 调用interrupt API 方式三 暴力结束线程-> Daemon Thread + interrupt API ...

  5. socket网络编程套接字TCP/UDP两种方式详解

    目录 准备知识 源IP地址和目的IP地址 端口号与进程ID 传输层协议--TCP 传输层协议--UCP 网络字节序 socket套接字介绍 概念 常见的三种socket socket编程常见API s ...

  6. python导入包相当于什么_Python 引入包的两种方式区别

    原博文 2014-05-16 11:18 − 1.import XXX仅仅是告诉我们需要使用这个包,但是你真正使用的时候,需要完整的导入这个包的全路径 比如: import wechat.views ...

  7. python抽奖简单小程序游戏_python——(分别用两种方式实现)公司年会抽奖小程序...

    张三科技有限公司有300名员工,开年会抽奖,奖项如下 一等奖3名 : 泰国五日游 二等奖6名 :iphone手机 三等奖30名 :避孕套一盒 规则: 1.一共抽3次,第一次抽3等奖,第二次抽2等奖,第 ...

  8. python读取音频文件_python 读取wav 音频文件的两种方式

    JavaScript算法(冒泡排序.选择排序与插入排序) 冒泡排序.选择排序与插入排序复杂度都是二次方级别的,放在一起说吧. 介绍一些学习这三个排序方法的比较好的资料.冒泡排序看介绍的冒泡排序,选择排 ...

  9. python创建多线程_Python 多线程,threading模块,创建子线程的两种方式示例

    本文实例讲述了Python 多线程,threading模块,创建子线程的两种方式.分享给大家供大家参考,具体如下: GIL(全局解释器锁)是C语言版本的Python解释器中专有的,GIL的存在让多线程 ...

最新文章

  1. python api开发用什么框架_python+requests接口自动化框架
  2. 十九、深入Python匿名函数
  3. [图解]小白都能看懂的FASTER R-CNN – 原理和实现细节
  4. java 反射解析xml_java反射获取xml元素
  5. Tensorflow中查看gpu是否可用
  6. CCF201503-3 节日(100分)
  7. 4 weekend110的hive入门
  8. 作为刚開始学习的人应该怎样来学习FPGA
  9. tomcat + apache组合配置
  10. angular解决跨域问题
  11. java实现爬虫_手把手教你从零开始用Java写爬虫
  12. 单片机c语言双边拉幕灯,51单片机C语言入门教程
  13. win10动态桌面软件
  14. MATLAB篇之层次分析法
  15. Scala中fold()操作和reduce()操作的区别
  16. windows默认共享的打开和关闭
  17. whisper客服源码_开源在线客服系统whisper
  18. 对京东商品评论进行词频统计并制作词云
  19. c++ 字符串去掉首尾空格_C++ 去掉字符串的首尾空格和全部空格
  20. 从零实现深度学习框架——GloVe从理论到实战

热门文章

  1. 电脑上怎么压缩jpg图片?什么软件压缩图片好用?
  2. 怨恨别人最终伤害的只有自己
  3. Phoenix之协处理器
  4. JavaSE基础加强(面向对象进阶)
  5. Facebook的c++开源库folly介绍
  6. jqm文件上传,上传图片,jqm的表单操作,jqm的ajax的使用,jqm文件操作大全,文件操作demo
  7. C++11:右值引用、移动构造、std::move, 以及使用emplace_back代替push_back
  8. 2021牛客训练营5 B 比武招亲(上)(组合数学)
  9. android 点击事件两次,Android 按钮点击两次触发不同的事件
  10. Android最新敲诈者病毒分析及解锁(11月版)