一个简单的例子让你秒懂 python多线程
python中的多线程是一个非常重要的知识点,但python 默认是单任务,所以今天简单的介绍一下多线程。
什么是线程:
- 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。
- 线程是进程中的一个实体,是CPU调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。
- 一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行
主线程:当⼀个程序启动时,就有⼀个进程被操作系统(OS)创建,与此同时⼀个线程也⽴刻运 ⾏,该线程通常叫做程序的主线程
主线程的重要性:
- 是产生其他子线程的线程
- 通常它必须最后完成执行各种关闭动作
子线程:可以看做是程序执⾏的⼀条分⽀,当⼦线程启动后会和主线程⼀起同时执⾏
使用threading .Thread(target=函数名,args=(参数列表,元组))创建子线程对象
那究竟什么是多线程呢,通过下面的例子很容易就搞懂了。
假如你要烧水和拖地还有玩游戏,一共三个任务,如果是单线程来处理这三个任务的话,先烧水,等水烧开,再拖地,然后才能玩游戏。这样等待水烧开的时间就白白浪费了,倘若事交给多线程来做的话,就先烧水,烧水的过程中(相当于IO操作的时候)把时间资源让出来给拖地和玩游戏,当拖完地且玩完游戏后水也烧好了,这个就是多线程的优势。
我们分别来看一下单线程和多线程的实现:
单线程:
import timedef mop_floor():print('我要拖地了')time.sleep(1)print('地拖完了')def game():print('我要玩游戏')time.sleep(4)print('游戏结束了')def heat_up_watrt():print('我要烧水了')time.sleep(6)print('水烧开了')start_time = time.time()
heat_up_watrt()
mop_floor()
game()
end_time = time.time()
print('总共耗时:{}'.format(end_time-start_time))
结果如下:
多线程:
import threading
import timedef mop_floor():print('我要拖地了')time.sleep(1)print('地拖完了')def game():print('我要玩游戏')time.sleep(4)print('游戏结束了')def heat_up_watrt():print('我要烧水了')time.sleep(6)print('水烧开了')start_time = time.time()
t1 = threading.Thread(target=heat_up_watrt)
t2 = threading.Thread(target=mop_floor)
t3 = threading.Thread(target=game)t1.start()
t2.start()
t3.start()t1.join()
t2.join()
t3.join()end_time = time.time()
print('总共耗时:{}'.format(end_time-start_time))
结果如下:
可以看到烧水等待的时候直接执行拖地任务,并且总共耗时为6秒,比上面的单线程节省了近一半的时间。
关于这里的start和jion都是固定的操作套路,记住这两个代词以后直接套用即可,需要注意的是多线程程序的执行顺序是不确定的。
当执行到sleep语句时,线程将被阻塞(Blocked),到sleep结束后,线程进入就绪(Runnable)状态,等待调度的命令执行另一个子线程,线程调度将自行选择一个线程执行。
如有错误,欢迎私信纠正,谢谢支持!
一个简单的例子让你秒懂 python多线程相关推荐
- 扩展Python模块系列(二)----一个简单的例子
本节使用一个简单的例子引出Python C/C++ API的详细使用方法.针对的是CPython的解释器. 目标:创建一个Python内建模块test,提供一个功能函数distance, 计算空间中两 ...
- pycharm安装scrapy失败_Scrapy ——环境搭配与一个简单的例子
在我刚接触爬虫的时候就已经听过Scrapy大名了,据说是一个很厉害的爬虫框架,不过那个时候沉迷于Java爬虫.现在终于要来揭开它神秘的面纱了,来一起学习一下吧 欢迎关注公众号:老白和他的爬虫 1.环境 ...
- 用几个最简单的例子带你入门 Python 爬虫
作者 | ZackSock 来源 | 新建文件夹X(ID:ZackSock) 头图 | CSDN下载自视觉中国 前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独 ...
- Django入门超easy系列(一)——— 从一个简单的例子入门
从一个简单的例子初识Django 当下最火的语言-Python和当下最火的Web开发框架-Django会擦出怎么样的火花!? 前言 我从去年十月份开始跟公司大佬学习Django,在本系列总结自己学习D ...
- 图解爬虫,用几个最简单的例子带你入门Python爬虫
一.前言 爬虫一直是Python的一大应用场景,差不多每门语言都可以写爬虫,但是程序员们却独爱Python.之所以偏爱Python就是因为她简洁的语法,我们使用Python可以很简单的写出一个爬虫程序 ...
- 一步一步解读神经网络编译器TVM(一)——一个简单的例子
@TOC 前言 这是一个TVM教程系列,计划从TVM的使用说明,再到TVM的内部源码?为大家大致解析一下TVM的基本工作原理.因为TVM的中文资料比较少,也希望贡献一下自己的力量,如有描述方面的错误, ...
- .net中的对象序列化(1): 序列化是什么, 以及一个简单的例子
1. 为什么需要序列化,什么是序列化 对于一个程序来说, 使用到的对象都是存在于内存中的.如果想保存这些对象的运行时状态, 或者需要在不同进程或者网络间传递对象,就需要序列化. 序列化就是讲运行中的对 ...
- 一个简单的例子看java线程机制
一个简单的例子看java线程机制 作者: zyf0808 发表日期: 2006-03-26 11:20 文章属性: 原创 复制链接 import java.util.*; public class T ...
- blockchain 区块链200行代码:在JavaScript实现的一个简单的例子
blockchain 区块链200行代码:在JavaScript实现的一个简单的例子 了解blockchain的概念很简单(区块链,交易链块):它是分布式的(即不是放置在同一台机器上,不同的网络设备上 ...
最新文章
- How to Make a Computer Operating System
- 大象公会:如何做万人传播的原创内容?
- 网易云信携手小天才电话手表 打造视频通话体验的行业标杆
- QT的QLocale类的使用
- 重装系统后删除Cygwin的安装文件
- python unicode 编程 pdf,Python | Python学习之unicode和utf8
- CentOS 6.5 安装 Redis 执行 make #error Newer version of jemalloc required
- 分享下我的 netbeans 的配色方案
- 浏览器HTML5 写入文件
- 系统集成项目管理之何为系统集成
- 小白入门必看 ‘微信小程序地图定位开发教程‘
- 添加Onvif设备到Blue IRIS步骤
- 内存、外存、硬盘、磁盘、闪存,傻傻分不清?
- markdown的各种操作
- cad放大_cad快捷键大全amp;鼠标各键用法
- 鸿蒙电视如何播放手机上的歌,鸿蒙这么用 荣耀智慧屏联动手机的正确打开方式...
- 代码注释规范之Doxygen
- 个人对PIN码的基本理解
- 按颜色分类:黄色系(Yellow)
- elgamal签名算法c语言,ELGamal数字签名.doc