没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
46页
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动 一个浏览器进程,打开记 事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开 一个 Word 就启动了一个 Word 进程。 进程:直观地说,进程就是正在执行的程序,为多任务操作系统中执行任务的基本单元,是包含了程序指令和相关 资源的集合。在Windows下,可以打开任务管理器,在进程标签栏中就可以看到当前计算机中正在运行的进程,操 作系统隔离各个进程可以访问的地址空间。如果进程间需要传递信息,则需要使用进程间通信或者其他方式,非常 不方便而且消耗CPU时间片段。为了能够更好地支持信息共享和减少切换开销,从进程中演化出了线程。
资源推荐
资源详情
资源评论
进程和线程的对比
我们知道,在一台计算机中,我们可以同时打开许多软件,比如同时浏览网页、听音乐、打字等等,看似非常正
常。但仔细想想,为什么计算机可以做到这么多软件同时运行呢?这就涉及到计算机中的两个重要概念:多进程和
多线程了。
进程和线程都是操作系统中的重要概念,既相似,又不同
对于一般的程序,可能会包含若干进程;而每一个进程又可能包含多个同时执行的线程。进程是资源管理的最小单
位,而线程则是程序执行的最小单位。
1. 进程和线程的概念
对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动 一个浏览器进程,打开记
事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开 一个 Word 就启动了一个 Word
进程。
进程:直观地说,进程就是正在执行的程序,为多任务操作系统中执行任务的基本单元,是包含了程序指令和相关
资源的集合。在Windows下,可以打开任务管理器,在进程标签栏中就可以看到当前计算机中正在运行的进程,操
作系统隔离各个进程可以访问的地址空间。如果进程间需要传递信息,则需要使用进程间通信或者其他方式,非常
不方便而且消耗CPU时间片段。为了能够更好地支持信息共享和减少切换开销,从进程中演化出了线程。
线程:线程是进程的执行单元。对于大多数程序来说,可能只有一个主线程。但是,为了能够提高效率,有些程序
会采用多线程,在系统中所有的线程看起来都是同时执行的。例如,现在的多线程网络下载程序中,就使用了这种
线程并发的特性,程序将欲下载的文件分成多个部分,然后同时进行下载,从而加快速度。
明确进程和线程的区别,这一点对于使用Python编程是非常重要的。一般的,进程是重量级的。具体包括进程映
像的结构、执行细节以及进程间切换的方法。在进程中,需要处理的问题包括进程间通信、临界区管理和进程调度
等。这些特性使得新生成一个进程的开销比较大。而线程刚好相反,它是轻量级的。线程之间共享许多资源,容易
进行通信,生成一个线程的开销较小。但是使用线程会有死锁、数据同步和实现复杂等问题。
并发编程解决方案
启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务
启动一个进程,在一个进程内启动多个线程,这样,多个线程也可以一块执行多个任务
启动多个进程,每个进程再启动多个线程,这样同时执行的任务就更多了,当然这种模型更复杂,实际很少
采用。
由于Python语言使用了全局解释器锁(Global Interpretor Lock ,GIL)和队列模块,其在线程实现的复杂度上相
对于其他语言来说要低得多。需要注意的是,由于GIL的存在,所以Python解释器并不是线程安全的。因为当前线
程必须持有这个全局解释器锁,才可以安全地访问Python对象。虽然使用GIL使得Python不能够很好地利用多CPU
优势,但是现在还没有比较好的办法来代替它,因为去掉GIL会带来许多问题。 所以,针对I/O受限的程序,如网
络下载类,可以使用多线程来提高程序性能。而对于CPU受限的程序,如科学计算类,使用多线程并不会带来效率
的提升。这个时候,建议使用进程或者混合进程和线程的方法来实现。
2. 进程的开发
在前面提到, Python对于进程和线程处理都有很好的支持。接下来介绍在Python语言的标准库中相关的模块:
模块
介绍
模块
介绍
os/sys
包含基本进程管理函数
subprocess
Python基本库中多进
程编程相关模块,适
用于与外部进程交
互,调用外部进程;
multiprocessing
也是Python基本库中多进程编程模块,核心
机制是fork,重开一个进程,首先会把父进
程的代码copy重载一遍
threading
Python基本库中多线
程管理相关模块
创建进程
subprocess模块
subprocess最早在2.4版本引入。用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的
返回值。用来替换多个旧模块和函数
运行python的时候,我们都是在创建并运行一个进程, (linux中一个进程可以fork一个子进程,并让这个子进程
exec另外一个程序)。在python中,我们通过标准库中的subprocess包来fork一个子进程,并且运行一个外部的程
序。 subprocess包中定义有数个创建子进程的函数,这些函数分别以不同的方式创建子进程,所欲我们可以根据
需要来从中选取一个使用。另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而
在进程间使用文本通信。
通俗地说就是通过这个模块,你可以在Python的代码里执行操作系统级别的命令,比如“ipconfig”、“du -sh”等等。
subprocess模块替代了一些老的模块和函数,比如:
subprocess过去版本中的call ,check_call和check_output已经被run方法取代了。 run方法为3.5版本新增。 大多
数情况下,推荐使用run方法调用子进程,执行操作系统命令。在更高级的使用场景,你还可以使用Popen接口。
其实 run() 方法在底层调用的就是Popen接口。
run
subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法可以直接使用 Popen 接口。
注意, run()方法返回的不是我们想要的执行结果或相关信息,而是一个CompletedProcess类型对象。
args:表示要执行的命令。必须是一个字符串,字符串参数列表。
stdin、stdout 和 stderr:子进程的标准输入、输出和错误。其值可以是 subprocess.PIPE、
subprocess.DEVNULL、一个已经存在的文件描述符、已经打开的文件对象或者 None。subprocess.PIPE 表
示为子进程创建新的管道。 subprocess.DEVNULL 表示使用 os.devnull。默认使用的是 None,表示什么都
不做。另外, stderr 可以合并到 stdout 里一起输出。
timeout:设置命令超时时间。如果命令执行时间超时,子进程将被杀死,并弹出 TimeoutExpired异常。
os.system
os.spawn*
subprocess. run(args, *, stdin=None, input=None, stdout=None, stderr=None,
capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None,
errors=None, text=None, env=None, universal_newlines=None)
check:如果该参数设置为 True,并且进程退出状态码不是 0,则弹 出 CalledProcessError 异常。
encoding: 如果指定了该参数,则 stdin、stdout 和 stderr 可以接收字符串数据,并以该编码方式编码。否
则只接收 bytes 类型的数据。
shell:如果该参数为 True,将通过操作系统的 shell 执行指定的命令。
run 方法调用方式,返回 CompletedProcess 实例,和直接 Popen 差不多,实现是一样的,实际也是调用 Popen,
与 Popen 构造函数大致相同,看一个例子
# coding=utf-8
# 文件名: subprocess_cmd.py
# 导入模块subprocess
import subprocess
# 这里我们使用了这么几个参数args,encoding,shell
# dir 在windows命令行中是遍历这个目录下的文件
# Linux可以使用 ls 命令
runcmd = subprocess.run(['dir', 'C:\\'], encoding='utf8', shell=True)
# 打印结果
print(runcmd)
看看运行结果
驱动器 C 中的卷没有标签。
卷的序列号是 0AA3-2019
C:\ 的目录
2018/03/16 10:16 <DIR> EFI
2020/03/18 17:33 <DIR> Intel
2020/07/13 11:10 <DIR> LeakHotfix
2020/07/15 16:50 <DIR> Program Files
2020/07/18 17:40 <DIR> Program Files (x86)
2020/06/22 11:51 <DIR> QMDownload
2020/03/18 17:43 <DIR> Users
2020/07/18 16:55 <DIR> Windows
0 个文件 0 字节
8 个目录 90,635,427,840 可用字节
CompletedProcess(args=['dir', 'C:\\'], returncode=0)
剩余45页未读,继续阅读
资源评论
北极的三哈
- 粉丝: 2w+
- 资源: 33
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功