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单线程/多线程相关推荐

  1. Python——单线程与多线程

    并发:一个人吃,一口菜一口包子,但由于切换速度快,感觉像在同时吃菜和包子 并行:两个人同时吃,一个人吃包子,一个吃菜,所有吃包子和吃菜是同时的.同步:并发或并行的各个任务不是独自运行的任务之间有一定的 ...

  2. Python|并发编程|爬虫|单线程|多线程|异步I/O|360图片|Selenium及JavaScript|Scrapy框架|BOM 和 DOM 操作简介|语言基础50课:学习(12)

    文章目录 系列目录 原项目地址 第37课:并发编程在爬虫中的应用 单线程版本 多线程版本 异步I/O版本 总结 第38课:抓取网页动态内容 Selenium 介绍 使用Selenium 加载页面 查找 ...

  3. python的多线程与单线程的效率问题

    先了解下CPU的简单运行原理: 它运行速度非常快,1s内可以运行成千上万次,一个核心可以把1s切分成成千上万个时间片段,这个核心确实同时只能运行一个任务:但是可以将多个任务交替执行,比如上一个时间片段 ...

  4. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

  5. Python之多线程

    Python的对线程为什么被说成是鸡肋? 1.1GIL是什么?(Global Interpreter Lock)Python设计之初,为了数据的安全所做的决定. 1.2Python 多线程下,每个线程 ...

  6. python多线程编程(1): python对多线程的支持

    From: http://www.cnblogs.com/holbrook/archive/2012/03/01/2376408.html 前面介绍过多线程的基本概念,理解了这些基本概念,掌握pyth ...

  7. python多线程编程_python多线程编程(1): python对多线程的支持

    前面介绍过多线程的基本概念,理解了这些基本概念,掌握python多线程编程就比较容易了. 在开始之前,首先要了解一下python对多线程的支持. 虚拟机层面 Python虚拟机使用GIL(Global ...

  8. 关于python的多线程和多进程_Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

  9. python的多线程适合计算密集操作_Python 多线程操作学习

    Python 多线程操作 什么是线程: 线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位.线程自己不拥有系统资源,只拥有一点儿在运行 ...

最新文章

  1. 如何解决编译linux内核(解决声卡问题),遭遇fatal error: linux/limits.h: 没有那个文件或目录
  2. visio图中包含公式,插入word后公式模糊终极解决办法
  3. 数据框按行拼接_利用Python进行数据分析
  4. java设计模式之UML③类图讲解多个类之间的关系
  5. 盘点PHP编程常见失误
  6. RN做的Android应用反编译,macOS Catalina配置Android反编译三件套 apktool/dex2jar/enjarify/jd-gui...
  7. uvc能支持多大分辨率_华为手环B5测评:该有的功能一个不缺,甚至还能变身蓝牙耳机...
  8. css过度效果 从无到有,求教,对于CSS3 transition和transform实现的一个特效原理不是太明白?...
  9. 方法重载 java 1614780176
  10. yum安装jdk1.8
  11. Dreamweaver插入Flash参数
  12. 三角形内部线性插值方法
  13. python 读取bin文件
  14. 【BIEE】MDS-01377:无法从使用 JNDI 名称 “jdbc/mds/owsm” 配置的数据源获取数据库连接...
  15. Vivado 使用方法
  16. 小米真蓝牙耳机说明书_小米真无线蓝牙耳机Air拆解:399元值了
  17. 【挨踢人物传】李晨光:兴趣铸就专业,努力决定成败
  18. 正则函数--search/match/findall/sub/split
  19. python excel动态图表_那些年做过的动态图表-实用漂亮的Excel动态图表
  20. 祭奠一位我无比亲爱的亲人的离去

热门文章

  1. GITHUB设置代理——解决git clone下载过慢的问题
  2. 基于面向过程写的七星彩票购买系统
  3. 山东大学2022-2023非关系型数据库(Nosql)期末考试
  4. 华为、海尔智家、小米都在做的全屋智能,全在哪?
  5. deep leaning
  6. Android超级管理员,实现一键锁屏等等
  7. python_安装模块后出错:无法启动程序丢失vcom140.dll
  8. ubuntu安装php扩展包
  9. matlab定义循环变量
  10. lottie 导出html,Lottie-前端实现AE动效