位置: 编程技术 - 正文

详解Python多线程(python 多线程处理)

编辑:rootadmin

推荐整理分享详解Python多线程(python 多线程处理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python多线程程序,python多线程怎么用,python多线程操作,python多线程技术,python3.9多线程,python 多线程,python多线程操作,python3.9多线程,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例为大家解析了Python多线程,供大家参考,具体内容如下

1、多线程的理解

多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦。

2、Python多线程创建

在Python中,同样可以实现多线程,有两个标准模块thread和threading,不过我们主要使用更高级的threading模块。使用例子:

输出:

start是启动线程,join是阻塞当前线程,即使得在当前线程结束时,不会退出。从结果可以看到,主线程直到Thread-1结束之后才结束。

Python中,默认情况下,如果不加join语句,那么主线程不会等到当前线程结束才结束,但却不会立即杀死该线程。如不加join输出如下:

但如果为线程实例添加t.setDaemon(True)之后,如果不加join语句,那么当主线程结束之后,会杀死子线程。代码:

输出如下:

如果加上join,并设置等待时间,就会等待线程一段时间再退出:

输出:

主线程等待1秒,就自动结束,并杀死子线程。如果join不加等待时间,t.join(),就会一直等待,一直到子线程结束,输出如下:

3、线程锁和ThreadLocal

(1)线程锁

对于多线程来说,最大的特点就是线程之间可以共享数据,那么共享数据就会出现多线程同时更改一个变量,使用同样的资源,而出现死锁、数据错乱等情况。

假设有两个全局资源,a和b,有两个线程thread1,thread2. thread1占用a,想访问b,但此时thread2占用b,想访问a,两个线程都不释放此时拥有的资源,那么就会造成死锁。

对于该问题,出现了Lock。 当访问某个资源之前,用Lock.acquire()锁住资源,访问之后,用Lock.release()释放资源。

用finally的目的是防止当前线程无线占用资源。

详解Python多线程(python 多线程处理)

(2)ThreadLocal

介绍完线程锁,接下来出场的是ThreadLocal。当不想将变量共享给其他线程时,可以使用局部变量,但在函数中定义局部变量会使得在函数之间传递特别麻烦。ThreadLocal是非常牛逼的东西,它解决了全局变量需要枷锁,局部变量传递麻烦的两个问题。通过在线程中定义:

local_school = threading.local()

此时这个local_school就变成了一个全局变量,但这个全局变量只在该线程中为全局变量,对于其他线程来说是局部变量,别的线程不可更改。 def process_thread(name):# 绑定ThreadLocal的student: local_school.student = name

这个student属性只有本线程可以修改,别的线程不可以。代码:

从代码中也可以看到,可以将ThreadLocal理解成一个dict,可以绑定不同变量。

ThreadLocal用的最多的地方就是每一个线程处理一个HTTP请求,在Flask框架中利用的就是该原理,它使用的是基于Werkzeug的LocalStack。

4、Map实现多线程

对于多线程的使用,我们经常是用thread来创建,比较繁琐:

如果要创建更多的线程,那就要一一加到里面,操作麻烦,代码可读性也变差。在Python中,可以使用map函数简化代码。map可以实现多任务的并发,简单示例:

map将urls的每个元素当做参数分别传给urllib2.urlopen函数,并最后把结果放到results列表中,map 函数一手包办了序列操作、参数传递和结果保存等一系列的操作。 其原理:

map函数负责将线程分给不同的CPU。

在 Python 中有个两个库包含了 map 函数: multiprocessing 和它鲜为人知的子库 multiprocessing.dummy.dummy 是 multiprocessing 模块的完整克隆,唯一的不同在于 multiprocessing 作用于进程,而 dummy 模块作用于线程。代码:

pool = ThreadPool()创建了线程池,其默认值为当前机器 CPU 的核数,可以指定线程池大小,不是越多越好,因为越多的话,线程之间的切换也是很消耗资源的。

results = pool.map(urllib2.urlopen,urls) 该语句将不同的url传给各自的线程,并把执行后结果返回到results中。

代码清晰明了,巧妙得完成Threading模块完成的功能。

5、Python多线程的缺陷:

上面说了那么多关于多线程的用法,但Python多线程并不能真正能发挥作用,因为在Python中,有一个GIL,即全局解释锁,该锁的存在保证在同一个时间只能有一个线程执行任务,也就是多线程并不是真正的并发,只是交替得执行。假如有个线程炮在核CPU上,当前工作的也只能是一个CPU上的线程。

6、Python多线程的应用场景。

虽然Python多线程有缺陷,总被人说成是鸡肋,但也不是一无用处,它很适合用在IO密集型任务中。I/O密集型执行期间大部分是时间都用在I/O上,如数据库I/O,较少时间用在CPU计算上。因此该应用场景可以使用Python多线程,当一个任务阻塞在IO操作上时,我们可以立即切换执行其他线程上执行其他IO操作请求。

总结:Python多线程在IO密集型任务中还是很有用处的,而对于计算密集型任务,应该使用Python多进程。

标签: python 多线程处理

本文链接地址:https://www.jiuchutong.com/biancheng/383466.html 转载请保留说明!

上一篇:Python用zip函数同时遍历多个迭代器示例详解(python中zip函数的用法)

下一篇:python入门基础之用户输入与模块初认识(python基础入门教程)

  • 房地产业预售房的预收款退回的涉税处理?
  • 营业账簿印花税申报期限
  • 公司中介费收入如何纳税
  • 个体户单位性质是什么
  • 年报从业人数可以填一人吗
  • 政府补助递延收益和其他收益的区别
  • 电子税务局财务负责人实名认证
  • 程序法和实体法的划分标准
  • 股权投资损失账务处理
  • 预收账款开票怎么做账
  • 应付账款周转次数公式的理解
  • 应付账款扣款怎么做账
  • 两所工资所得怎么扣税
  • 收到供应商违约金 发票
  • 个人挂靠公司承接工程如何做会计处理?
  • 增值税发票红冲后增值税销项为负数
  • 融资租赁的利息可以税前扣除吗
  • symtray.exe - symtray是什么进程 有何作用
  • 以前年度损益调整怎么做账
  • 交易性金融资产是什么意思
  • 扣客户的罚款会计科目
  • php验证码代码怎么写
  • 在php中使用什么获取文件的修改时间
  • 铁杆茉莉的养殖方法
  • PHP:Memcached::delete()的用法_Memcached类
  • php文件上传用什么请求方法
  • wgcore.dll是什么文件夹
  • 有限公司股权转让怎么办理流程
  • 为什么很多银行卡会被异地警方冻结
  • vue插槽有什么作用
  • 未税收入怎么做分录
  • thinkphp pathinfo
  • vue组件元素设置滚动条高度
  • apdl命令流手册下载
  • 正则动量
  • mysql的删除
  • 中医经营范围,营业执照怎么写
  • 财政拨款事业单位的办公用车免征车船税吗
  • 交通费 抵扣
  • 所得税费用的账目处理
  • 小规模纳税人报哪些税
  • 实际发的工资跟个人所得税不一样怎么办
  • 一般纳税人购买原材料会计分录
  • 两个公司之间怎么走账
  • 没开发票能确认没开发票能确认收入申报纳税吗?
  • 发票金额跟实际金额为什么不一样
  • 发票红冲后原票是什么状态
  • 一件产品在不同场合的价格
  • 公司场地租赁交什么税
  • 建筑公司直接把钱打到个人账户怎么走账
  • 客户火车票可以抵扣进项税吗
  • 会计账簿的设计要与会计报表相衔接 ()X
  • mysql 5.6 5.7
  • sql数据库修改数据语句
  • win8升级win10系统会卡吗
  • windows7个性化菜单
  • linux find命令忽略大小写
  • os x10.11el capitan beta3下载地址
  • 在cenots下使用iso光盘文件重新安装CentOS的方法步骤
  • win10预览版好吗
  • xp怎么改密码怎么设置
  • centos 添加服务
  • 电脑为什么会黑屏
  • win7系统回收站不见了怎么办
  • win10纯净系统安装教程
  • perl时间函数
  • js闭包的理解详解
  • python怎么运作
  • excel自定义样式
  • js创建对象的三种方式
  • android中的动画有哪几类,它们的特点和区别是什么?
  • 自动搜索工具
  • 关于Air端与android端的通信实现
  • 下载随手笔记
  • python语言中
  • 夫妻双方房子契税怎么算
  • 北京重点税源直报平台登录
  • 广东省地方税务局电子办税服务厅
  • 国家税务总局多少员工
  • 税务登录 河北省地方税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设