Python单线程/多线程
Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!
利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是单线程。
import threading
import timedef test1():for i in range(10000000):a = 100 - idef test2():threads = []t1 = threading.Thread(target=test1) #创建一个线程,target代表要指定执行什么t2 = threading.Thread(target=test1)t3 = threading.Thread(target=test1)t4 = threading.Thread(target=test1)threads.append(t1) #把线程放到list里面threads.append(t2)threads.append(t3)threads.append(t4)threads[0].start() #启动这个线程threads[1].start()threads[2].start()threads[3].start()threads[0].join() #主线程等待子线程threads[1].join()threads[2].join()threads[3].join()if __name__ == '__main__':t1 = time.time()test1()print('单线程一次:', time.time() - t1) # 单线程一次: 0.5700154304504395test1()print('单线程两次:', time.time() - t1) # 单线程两次: 1.1943449974060059test1()print('单线程三次:', time.time() - t1) # 单线程三次: 1.8057115077972412test1()print('单线程四次:', time.time() - t1) # 单线程四次: 2.410094738006592t2 = time.time()test2()print('多线程四次:', time.time() - t2) # 多线程四次: 2.4066476821899414
多线程执行时间 约等于 单线程执行时间,可见多线程并没有提高效率。
多线程执行的本质就是 各线程交替轮番执行,和谐的随机在单核上执行。
多线程有什么用?
解决I/O阻塞问题和I/O占用时CPU闲置问题。
I/O操作不占用CPU ,计算操作占CPU。
举例:
接口A处理需要花费10s接口B处理需要花费5s接口C处理需要花费2s
三个用户(几乎同时):小红请求A接口,小明请求B接口,小张请求C接口
单线程下:小红10s收到结果,小明15s收到结果,小张17s收到结果多线程下:小红13s收到结果,小明7s收到结果,小张3s收到结果
Python应用多线程的根本目的:使程序交替轮番执行,不会对后边的程序产生阻塞。
注意:多线程提升不了CPU的处理效率,只能提供调用CPU的方案
所以如果运行瓶颈不在CPU运算而在I/O上,多线程显然很划算。
拓展:Python多线程中 join() 的用法
import threading
import timedef run():time.sleep(2)print('当前线程的名字是: ', threading.current_thread().name)time.sleep(2)if __name__ == '__main__':start_time = time.time()print('这是主线程:', threading.current_thread().name)thread_list = []for i in range(5):t = threading.Thread(target=run)thread_list.append(t)for t in thread_list:t.start()print('主线程结束了!' , threading.current_thread().name)print('一共用时:', time.time()-start_time)
join的作用:
import threading
import timedef run():time.sleep(2)print('当前线程的名字是: ', threading.current_thread().name)time.sleep(2)if __name__ == '__main__':start_time = time.time()print('这是主线程:', threading.current_thread().name)thread_list = []for i in range(5):t = threading.Thread(target=run)thread_list.append(t)for t in thread_list:t.setDaemon(True)t.start()for t in thread_list:t.join()print('主线程结束了!' , threading.current_thread().name)print('一共用时:', time.time()-start_time)
作用:主线程一直等待全部的子线程结束之后,主线程自身才结束,程序退出。
参考:python是单线程的,多线程有意义么_fangxiananvhai的博客-CSDN博客_python为什么是单线程
Python多线程与多线程中join()的用法 - cnkai - 博客园
Python单线程/多线程相关推荐
- Python——单线程与多线程
并发:一个人吃,一口菜一口包子,但由于切换速度快,感觉像在同时吃菜和包子 并行:两个人同时吃,一个人吃包子,一个吃菜,所有吃包子和吃菜是同时的.同步:并发或并行的各个任务不是独自运行的任务之间有一定的 ...
- Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)
文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...
- python的多线程与单线程的效率问题
先了解下CPU的简单运行原理: 它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务:但是可以将多个任务交替执行,比如上一个时间片段 ...
- python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...
原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...
- Python之多线程
Python的对线程为什么被说成是鸡肋? 1.1GIL是什么?(Global Interpreter Lock)Python设计之初,为了数据的安全所做的决定. 1.2Python 多线程下,每个线程 ...
- python多线程编程(1): python对多线程的支持
From: http://www.cnblogs.com/holbrook/archive/2012/03/01/2376408.html 前面介绍过多线程的基本概念,理解了这些基本概念,掌握pyth ...
- python多线程编程_python多线程编程(1): python对多线程的支持
前面介绍过多线程的基本概念,理解了这些基本概念,掌握python多线程编程就比较容易了. 在开始之前,首先要了解一下python对多线程的支持. 虚拟机层面 Python虚拟机使用GIL(Global ...
- 关于python的多线程和多进程_Python的多线程和多进程
(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...
- python的多线程适合计算密集操作_Python 多线程操作学习
Python 多线程操作 什么是线程: 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一点儿在运行 ...
最新文章
- 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录
- visio图中包含公式,插入word后公式模糊终极解决办法
- 数据框按行拼接_利用Python进行数据分析
- java设计模式之UML③类图讲解多个类之间的关系
- 盘点PHP编程常见失误
- RN做的Android应用反编译,macOS Catalina配置Android反编译三件套 apktool/dex2jar/enjarify/jd-gui...
- uvc能支持多大分辨率_华为手环B5测评:该有的功能一个不缺,甚至还能变身蓝牙耳机...
- css过度效果 从无到有,求教,对于CSS3 transition和transform实现的一个特效原理不是太明白?...
- 方法重载 java 1614780176
- yum安装jdk1.8
- Dreamweaver插入Flash参数
- 三角形内部线性插值方法
- python 读取bin文件
- 【BIEE】MDS-01377:无法从使用 JNDI 名称 “jdbc/mds/owsm” 配置的数据源获取数据库连接...
- Vivado 使用方法
- 小米真蓝牙耳机说明书_小米真无线蓝牙耳机Air拆解:399元值了
- 【挨踢人物传】李晨光:兴趣铸就专业,努力决定成败
- 正则函数--search/match/findall/sub/split
- python excel动态图表_那些年做过的动态图表-实用漂亮的Excel动态图表
- 祭奠一位我无比亲爱的亲人的离去