二十二、 深入Python的进程和线程(上篇)
「@Author: Runsen」
进程(Process)和线程(Thread)都是操作系统中的基本概念 , 它们之间有一些优劣和差异 , 那么在Python中如何使用进程和线程?
CPU计算机的核心是CPU , 它承担了计算机的所有计算任务 , CPU就像一个工厂 , 时刻在运行着 , 而操作系统管理着计算机 , 负责任务的调度、资源的分配和管理 。
进程进程是指在系统中能独立运行并作为资源分配的基本单位 , 它是由一组机器指令、数据和堆栈等组成的 , 是一个能独立运行的活动实体 。
我们打开我们的计算机就会看到进程和线程 , 点击我的电脑就可以看到CPU的运算 。
文章插图
从如图中 , CPU一共运行着190个进程 , 2620个线程 。 比如 , 当我们再次点击QQ , 登陆另一个账号的时候又会开启另一个QQ进程 。
因此 , 如果想在电脑登入多个微信 。 只需要找到你的微信快捷方式 , 单击右键查看属性 , 在目标中复制链接;新建一个记事本 , 随便取个名字 , 双击打开后 , 在其中输入 start ""(注意引号为英文状态 , 且前后有空格) , 将刚刚复制的链接(也就是微信安装的路径)粘贴进去;然后复制整行 , 想开几个微信就粘贴几行;保存文件 , 更改后缀名为 bat 。 双击运行即可 。
文章插图
线程线程(Thread)也叫轻量级进程 , 是操作系统能够进行运算调度的最小单位 , 它被包涵在进程之中 , 是进程中的实际运作单位 。
记得阮一峰写过的博客:假定工厂的电力有限 , 一次只能供给一个车间使用 。 也就是说 , 一个车间开工的时候 , 其他车间都必须停工 。 背后的含义就是 , 单个CPU一次只能运行一个任务 。
文章插图
进程就好比工厂的车间 , 它代表CPU所能处理的单个任务 。 任一时刻 , CPU总是运行一个进程 , 其他进程处于非运行状态 。
线程就好比车间里的工人 。 一个进程可以包括多个线程 , 协同完成一个任务 。
总结来说:「程序可以包含多个进程 , 多个进程并发执行 , 相互独立 , 因此 , 进程也是系统进行资源分配和调度基本单位 。 专业化来说:进程是指程序执行时的一个实例 。 线程是最小的执行单元 , 而进程由至少一个线程组成 。 如何调度进程和线程 , 完全由操作系统决定 。 」
在Python中线程和进程的使用现在讲下在Python线程和进程的使用 。
在Python中 , 通过两个标准库thread和 Threading提供对线程的支持,threading对 thread进行了封装 。 threading模块中提供了 Thread,Lock, RLOCK, Condition等组件
Thread在Python中线程和进程的使用就是通过Thread这个类 。 这个类在我们的_thread和threading模块中 。 我们一般通过threading导入 。
默认情况下 , 只要在解释器中 , 如果没有报错 , 则说明线程可用 。
>> from threading import Thread
下面是Thread类的常用参数说明和实例方法 。
文章插图
文章插图
我们看一个官方文档中标准的多线程的例子 。
import threadingimport time# 定义线程要运行的函数def func(name):# 为了便于观察 , 睡眠2秒time.sleep(2)print("My name is %s\t" % name)# 创建第一个线程的实例 , args参数是一个元组 , 后面必须加逗号分隔t1 = threading.Thread(target=func, args=("Runsen",))# 创建第二个线程的实例t2 = threading.Thread(target=func, args=("Maoli",))t1.start()t2.start()# 先打印线程名 print(t1.getName())print(t2.getName())
由于两个线程是同时运行的 , 所以print打印处理的结果并没有换行 。
文章插图
下面我写了下面的代码 , 加深threading模块的使用 。
# -*- coding:utf-8 -*-# time :2019/4/9 21:52# author: Runsenimport threadingimport timedef fun1():print('hello')time.sleep(2)print('Bye')def fun2():print('hi')time.sleep(2)print('OUT')t1 = threading.Thread(target=fun1)t2 = threading.Thread(target=fun2)t1.start()t2.start()# t1.join()# t2.join()print('主线程完毕')
下面是输出结果 。
hellohi主线程完毕ByeOUT
我们先不加join()来阻塞 , t1和t2两个线程同时执行 , 由于位置关系先打印hello , 再打印hi , 这个时候都sleep2秒钟 , 但是它sleep2秒钟 , 主程序还是在执行 , 所以下面打印print('主线程完毕') , 最后才打印Bye和OUT 。
- 空调|让格力、海尔都担忧,中国取暖“新潮物”强势来袭,空调将成闲置品?
- 占营收|华为值多少钱
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 页面|如何简单、快速制作流程图?上班族的画图技巧get
- 操盘|中兴统一操盘中兴、努比亚、红魔三大品牌
- 印度|拒绝华为后,印度、英国斥资数十亿求助日本
- 华为|台积电、高通、华为、小米接连宣布!美科技界炸锅:怎么会这样!
- 拍照|iPhone12还没捂热13就曝光了,屏幕、信号、拍照均有升级!
- 路由器|家里无线网经常断网、网速慢怎么办?教你几个小窍门,轻松解决
- 一图看懂!数字日照、新型智慧城市这样建(上篇)|政策解读 | 新型