python中的threading_python中的threading模块使用说明

这段时间使用python做串口的底层库,用到了多线程,对这部分做一下总结。实际用完了后再回过头去看python的官方帮助文档,感觉受益匪浅,把里面的自己觉得有用的一些关键点翻译出来,留待后续查验。

threading是thread的高级接口模块,包括了除了thread模块,还有mutex模块、queue模块、dummy_threading模块方面的内容。

该模块定义了一下几方面的函数和对象:

threading.activeCount() :返回现存在活动状态的线程数。返回的数目等于enumerate()列表的长度。

threading.Condition():是返回一个新的condition变量类型的工厂函数(返回对象的函数)。一个condition类型的变量允许一个或多个线程等待,直到被另一个线程通知。

threading.currentThread() :根据用户线程句柄,返回当前的线程对象。如果线程句柄并未通过threading模块创建,有限功能的哑线程会被创建。

threading.enumerate() :返回所有活动线程对象列表。包括守护线程、由current_thread()创建的哑线程以及主线程。不包括终止了的线程和未开始的线程。

threading.Event() :是返回一个新的event类型的工厂函数。一个event管理一个标识,可以使用set()方法设置为true,也可以由clear()方法重置为false。wait()方法会阻塞直到这个标识为true。

class threading.local:代表线程本地数据的类。线程本地数据是该线程独有的。通过创建一个local实例,可以管理线程本地数据,并且能存储其属性。如:

mydata = threading.local()

mydata.x = 1

该属性的值因线程不同而异。

threading.Lock() :是一个返回新的单锁对象的工厂函数。只要一个线程获取该锁,相关其他要获取该锁的线程都会阻塞,直到锁被释放。任何线程都可以释放它。

eg:

testLock=threading.Lock()

testLock.acquire()#对锁的使用,也可以不用acquire()和release,直接使用with testLock:即可

self._test=True

testLock.release()

(注意:互斥锁用来锁定不同线程中的互斥量,锁的内容尽可能简洁,只锁定必须互斥的部分,以节省线程运转的时间)

threading.RLock() :返回一个可重入锁的工厂函数。可重入锁必须由创建它的线程释放。一旦一个线程获取了一个可重入锁,同一线程内可以继续获取它而不阻塞。线程获取了几次可重入锁,必须释放同样的次数。

(在此次项目实践中,重锁没有用到,但知道了这样的场景,即同一线程,如果锁中间调用的函数,有用到同样的锁,如果用单锁,会发生死锁,而用可重入锁,不会发生阻塞,可以防止这样场景下的死锁。)

threading.Semaphore([value]) :是返回一个新的信号量对象的工厂函数。信号量管理一个计数器,代表调用release()的个数减去调用acquire(),再加上初始值的数目。当该值为负数时,acquire()方法会阻塞。value的默认值是1。

(当时考系统分析师,对于信号量总是理解的很抽象,其实就是控制线程同步和互斥量的。当初创建这一概念的科学家使用p()和V()取代了acquire()和release()。信号量管理一个内部计数器,每调用一个acquire()就递减一次,每调用release()就递增一次。这个计数器不能小于0。一旦调用acquire()时发现它小于0,则线程阻塞,直到其他线程调用release()。)

class threading.Thread:代表线程句柄的类。

threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。

thread是线程类,有两种使用方法,直接传入要运行的方法(推荐,简便)或从thread继承并覆盖run()。一旦线程对象被创建,必须调用线程的start()方法开始线程。这一操作会唤醒每个线程的run()方法。当线程开始后,这个线程被认为是活动的。当它的run()方法终结,线程就结束了,或者通常的做法是,是触发一个不能处理的异常。可以用is_alive()方法判断线程是否活动。

其他线程可以调用某个线程的join()方法。这会阻塞当前上下文环境的线程,直到调用此方法的线程终止。

一个线程可以被标识为“守护线程”。当所有子线程为守护线程时,如果主线程结束,则所有子线程也就结束了。比较优雅的退出方法是引入event抛出异常。

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

group:必须是none,留待后续扩展应用。

target:被调用的函数对象

name:线程名,可默认不填,由系统自动创建

args:调用函数对象的传参,是一个元祖类型

kwargs:函数传参,是字典类型

如果子类重载了此构造函数,必须在对此线程操作之前,在子类中显式调用构造函数(thread.__init__())

start():每个线程中只能最多调用一次,否则会抛出运行错误。

run():在子类中重载此方法。

join([timeout]):等待直到线程终结。这会阻塞当前上下文环境的线程,直到调用此方法的线程终止或超时。

(因此当所有子线程结束后,主线程才会结束)

isAlive():返回该线程是否活动。

daemon:setDaemon()必须在线程启动start()之前调用,否则会抛出运行错误异常。

condition对象:一个condition对象通常和某种锁关联。condition变量拥有acquire()和release()方法,可调用相应的锁。还有wait()方法,notify()方法和notifyall()方法,但这三种方法必须在获取到锁之后进行,否则会抛出运行错误异常。

class threading.Condition([lock]) :如果参数lock给出,必须是Lock或RLock的对象。

acquire(*args):获取一个基础锁。

release() :释放锁

wait([timeout]) :等待,直到被通知或者超时。如果线程没有获取到锁,而调用了这个方法,则会抛出运行错误异常。

此消息会释放基础锁,然后阻塞直到因为在另一线程的同样的condition变量被notify或notifyAll()唤醒,一旦唤醒或超时,会重新获取锁并返回(好拗口,直白的意思就是“我累了,休息会儿,资源你们先拿去用”,然后要等待其他获取锁的线程,调用条件变量的notify或者nofityAll方法,才能把原有等待的线程唤醒继续执行)。

如果锁是一个可重入锁,并不能通过release方法被释放,原因是当它被锁了好多次的时候,这可能并没有真的解开锁。然而,一个可重入锁磊的内部接口被使用,这可以真的解开锁即便锁被获取了多次。

notify(n=1):默认情况下,唤醒一个等待的情况变量。

Event对象:这是最简单的线程间通信机制之一:一个线程释放一个event事件,而其他线程捕捉它。

一个event对象管理一个内部标识可以通过set()方法设为true,也可以通过clear()方法设为false。wait()方法会阻塞,直到该标识为True。默认是False

set():设置该标识为True。所有等待它为True的线程会被唤醒。调用wait()的线程,一旦该标识为True就不会再阻塞。

clear():设置该标识为false。相应地,调用wait的线程会阻塞,直到调用set方法把标识设为true

wait():当内部标识为true时阻塞。如果该内部标识一开始就是true,直接返回。否则,会阻塞知道其他线程调用se()把标识设为true,或者直到可选的超时发生。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统防止绕过程序直接数据库修改数据(金额等敏感数据)

对数据库中的每一行敏感数据设有独有的数字签名,每一次修改数据库我们都在底层进行签名校验进行比较。 未经授权的数据库修改无法通过校验,程序进行终止操作并提示异常。 如: keyStr1amountaccountkey 可对keyStr1进行hash加密(si…

软件工程阅读笔记3

第七章主要是测试与改错。测试的目的是为了发现尽可能多的缺陷。测试并不仅是个技术问题,更是个职业道德问题。在软件测试时如果发现了错误,必须请程序员改错,否则测试工作就白干了。改错是个大悲大喜的过程,一天之内可以让人在悲…

四、PHP基础——会话技术Cookie 和 Session

会话技术初步认识 会话技术介绍 web会话可简单理解为:用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。 HTTP协议的特点是…

python三级菜单设计题目_Python三级菜单

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 三级菜单:打印省、市、县三级菜单。 可返回上一级,可随时退出程序首先准备基础数据zone{山东:{青…

c#复习-2

输入三个学生的信息学号、姓名、分数从大到小排序 1 using System;2 using System.Collections;3 using System.Collections.Generic;4 using System.Linq;5 using System.Text;6 7 namespace 复习CS8 {9 class Program 10 { 11 struct Student 12 { 1…

加入 Git 版本管理(git的基本使用)

加入 Git 版本管理 https://github.com/zep03/toutiao-publish-admin/tree/master/src 建议在项目的一开始就加入版本管理,通过版本管理,我们可以得到很多好处,例如: 代码备份 多人协作 历史记录 … 下面是具体的操作流程。 …

long类型python_Python类型long vs C'long long'

I would like to represent a value as a 64bit signed long, such that values larger than (2**63)-1 are represented as negative, however Python long has infinite precision. Is there a quick way for me to achieve this? 解决方案>>> from ctypes import …

软工课程读书笔记

这个学期的软工课程相对而言是很特殊的,没有期末考试,取代的三个由简到难的项目,也由一人变成多人团队开发,还有每周一篇的博客来记录自己的学习情况。这就要求我们平时注重知识的积累,多看书才能很好的完成任务。 软件…

Vue中富文本编辑器的使用

基于 Vue 的富文本编辑器有很多,例如官方就收录推荐了一些: https://github.com/vuejs/awesome-vue#rich-text-editing 。 这里我们以 element-tiptap 为例。 GitHub 仓库:https://github.com/Leecason/element-tiptap 在线示例&#xff1a…

python中continue格式_python自学(3)--for 、 while、 break、continue、字符格式化输出...

一、循环语句 1.for 语句 有限循环 ,次数限制 格式: for i in range (3): 例子: _username "zhichengfang" _password "fzc2551352" for i in range(3) : username input("use…

Vue项目中使用Echarts(一)

Echarts官方文档 1. 安装Echarts 在cmd命令行输入: npm install echarts --save 2. 代码中使用 注意:import 引入echarts 包时,不要使用 import echarts from ‘echarts’ 而要使用import * as echarts from echarts 否则会报错如下: 3. 页…

Google Guava缓存实现接口的限流

一.项目背景 最近项目中需要进行接口保护,防止高并发的情况把系统搞崩,因此需要对一个查询接口进行限流,主要的目的就是限制单位时间内请求此查询的次数,例如1000次,来保护接口。 参考了 开涛的博客聊聊高并发系统限流…

javaweb 常用jar包_使用javaweb写一个登录案例

下载地址:https://gitee.com/dl_shrimp/java_web_login_case.githttps://www.zhihu.com/video/1241780888599699456讲一下如何使用javaweb写一个登录案例Dao就是用来操作数据库的一些类的统称(1)DAO是Data Access Object数据访问接口。数据访…

Vue项目中使用图片裁切器 cropperjs (头像裁切)

cropperjs官方文档 cropperjs结合element-ui 组件后的显示效果: 1. npm 安装 cropperjs cmd命令行输入:npm install cropperjs --save 2. 导入相关js和css文件 import cropperjs/dist/cropper.css import Cropper from cropperjs3. 用块元素(容器&…

mysql常见问题记录

1.常见命令:查看mysql表结构的方法有三种:1、desc tablename;2、show create table tablename;3、use information_schema;select * from columns where table_nametablename例如:要查看jos_modules表结构的命令:use information_…

跳一跳python源码下载_python 微信跳一跳和源码解读

刚好周末,想研究一下前阵子很火的微信跳一跳 下面进入正文。 本文适用对象为WIN10系统,安卓用户。目的在于让丝毫没有接触过Python的小伙伴都能成功运行,如果你恰好是这样的对象,那么跟着我开始操作。我会把我自己的每一步都写下来…

HTML文件上传对象file

window.URL.createObjectURL(fileObj)

python自动化接口测试excel用例串行之行_python 读取 Excel 自动化执行测试用例

python 读取 Excel 自动化执行测试用例 Excel 测试用例的读取 安装 python 操作Excel 的库 pip install xlrd/xlwt/xlutils (安装三个操作库) 接口请求代码构建 import requests from random import randint import xlrd import json class My_request(object): # 对返回值进行…

Vue项目中使用Echarts(二)

1. 安装&#xff1a; 通过 npm 获取 echarts&#xff0c;npm install echarts --save 2. 最终页面展示效果如下&#xff1a; 三、代码实现 map-demo.vue: <template><!-- 1. 为 ECharts 准备一个具备大小&#xff08;宽高&#xff09;的 DOM --><div ref&quo…

python批量处理excel文本改为数字_Python批量修改Excel中的文件内容

import os import xlrd from xlutils.copy import copy def base_dir(filenameNone): return os.path.join(os.path.dirname(__file__),filename) """对excel进行操作""" work xlrd.open_workbook(base_dir("excel.xls")) # 索引到第…