Python档案袋(线程 )
Python的进程和线程是使用的操作系统的原生线程和进程,其是去调用操作系统的相应接口实现
进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程
线程:基于进程,之间可直接共享数据,可执行,只有所有的线程执行完毕程序才会退出
守护线程:生命值依赖于创建它的主线程,主程序亡,不管守护进程执行到何步也必须立即亡
多线程:不适用与CPU操作任务大的(如计算等),较适合于IO操作任务大的(如文件读写等)
线程实现
简单的线程:
import threading
#线程实现方法,取名任意
def run11(varx):
print("run11",varx)
#创建线程1
t1=threading.Thread(target=run11,args=("var1111",))
t1.start()
#创建线程2
t2=threading.Thread(target=run11,args=("var2222",))
t2.start()
类方法实现线程:
import threading
class DongThreadx(threading.Thread):
#构造方法,可以忽略不写
def __init__(self,varx):
#调用父类的构造方法
super(DongThreadx,self).__init__()
self.threadvar=varx #run方法名不能更改
def run(self):
print("类线程:",self.threadvar)
#创建两个线程
t1=DongThreadx("dongxiaodong11")
t1.start()
t2=DongThreadx("dognxiaodong22")
t2.start()
守护线程实现:
t2=threading.Thread(target=run11,args=("var2222",))
t2.setDaemon(True) #使其成为主线程守护线程
t2.start()
线程补充
其他方法:
print(threading.current_thread()) #当前所属的线程
print(threading.active_count()) #当前活跃的总线程数
t1.join() #等待线程 t1 执行完毕
等待子线程执行完毕:
方法一:
使用join
import threading
import time
num=0 #延时并自增1
def run11():
global num
time.sleep(2)
num+=1 #生成1000个线程
listthreadx=[]
for i in range(10000):
#创建线程
t1=threading.Thread(target=run11,args=())
listthreadx.append(t1)
t1.start() #等待1000个线程执行完毕,并输出结果
for t in listthreadx:
t.join() print("总数为:",num)
方法二:
如果使用【threading.active_count()】的值为1,也说明子线程执行完毕
while threading.active_count() !=1:
pass
print("总数为:",num)
线程锁:
在多个线程中修改同一个数据时,可能会出现数据修改不正确,其是因为多核CPU和多线程造成的,在Python3中已经优化了此类错误,Python2可以使用线程锁进行优化:
lockx=threading.Lock() #得到锁实例
#延时并自增1
def run11():
lockx.acquire() #获取线程锁
global num
num+=1
lockx.release() #释放线程锁
递归锁
【lockx=threading.RLock()】,实现锁和钥匙的一一对应,如果程序有内外嵌套锁时,可以使用其优化
信号量:
规定同时执行的最大线程数
blockx=threading.BoundedSemaphore(10) # 表示10为最大同时启动线程数
#延时并自增1
def run11():
blockx.acquire() #获取线程锁
global num
num+=1
blockx.release() #释放线程锁
标志位:
在线程中封装了bool,实现了基本的标志位功能,其主要方法有:
eventx=threading.Event() #得到event实例
eventx.set() #设置标志位
eventx.wait()#等待标志位设置,一直处于阻塞
eventx.clear() #清除标志位
import threading
import time eventx=threading.Event() #得到event实例 def run11():
print("-----开始,等待标志位----")
eventx.wait()#等待标志位设置,一直处于阻塞
print("---阻塞取消,执行完成------")
eventx.clear() #清除标志位 def run22(times):
time.sleep(times)
eventx.set() #设置标志位 #执行线程
t1=threading.Thread(target=run11,args=())
t1.start() #延时线程
t2=threading.Thread(target=run22,args=(3,))
t2.start()
Python档案袋(线程 )的更多相关文章
- Python之线程、进程和协程
python之线程.进程和协程 目录: 引言 一.线程 1.1 普通的多线程 1.2 自定义线程类 1.3 线程锁 1.3.1 未使用锁 1.3.2 普通锁Lock和RLock 1.3.3 信号量(S ...
- python/进程线程的总结
python/进程线程的总结 一.进程和线程的描述: 进程:最小的资源管理单位 线程:最小的执行单位 执行一个进程时就默认执行一个线程(主线程) 进程和线程的工作方式: 串行: 假如共有A.B.C任务 ...
- 在python中单线程,多线程,多进程对CPU的利用率实测以及GIL原理分析
首先关于在python中单线程,多线程,多进程对cpu的利用率实测如下: 单线程,多线程,多进程测试代码使用死循环. 1)单线程: 2)多线程: 3)多进程: 查看cpu使用效率: 开始观察分别执行时 ...
- python中线程和进程(一)
目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定 ...
- 一文了解Python的线程
问题 什么是线程? 如何创建.执行线程? 如何使用线程池ThreadPoolExecutor? 如何避免资源竞争问题? 如何使用Python中线程模块threading提供的常用工具? 目录 1. 什 ...
- <python的线程与threading模块>
<python的线程与threading模块> 一 线程的两种调用方式 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而thre ...
- Python之线程 2 - Python实现线程
一 python与线程 1.全局解释器锁GIL(用一下threading模块之后再来看~~) 2.python线程模块的选择 二 Threading模块 1.线程创建 2.多线程与多进程 3.多线程实 ...
- python之线程相关操作
1.线程: 一个进程可以有多个线程,共享一个进程的资源: 2.进程线程的区别: 进程是资源分配的最小单位,线程是程序执行的最小单位 3.python中线程模块threading, 提供的类: Thr ...
- Python:线程之定位与销毁
背景 开工前我就觉得有什么不太对劲,感觉要背锅.这可不,上班第三天就捅锅了. 我们有个了不起的后台程序,可以动态加载模块,并以线程方式运行,通过这种形式实现插件的功能.而模块更新时候,后台程序自身不会 ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
随机推荐
- .net Core+Dapper MySQL增删改查
新建一个用户表,以该有为例 1.Model层 public class TuiUsers { public int id { get; set; } public string userName { ...
- 小程序-canvas在IOS手机层级最高无法展示问题
要求的效果: 正面: 背面: 在开发者工具 利用css 和定位实现了一个版本 .topBox.on { transform:rotateY(180deg); } .topBox { position: ...
- 什么是nrm
什么是nrm nrm 是一个 npm 源管理器,允许你快速地在 npm 源间切换. 安装nrm 在命令行执行命令,npm install -g nrm,全局安装nrm. 使用 执行命令nrm ls查看 ...
- leetcode刷题正则表达式
题目链接:https://leetcode-cn.com/problems/regular-expression-matching/ 这道题用到了动态规划: 关于动态规划请参考这篇博文:https:/ ...
- scrapy初始和简单应用
什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有 ...
- 修改 bug 总结
对于 elementui table 组件的排序 要求对每列数据进行排序 数据是 金额之类 数字的没问题 但是 针对 标题中有数字,字母,文字的时候 会排序错误 :sort-method=" ...
- 第n次搭建 SSM 框架
什么说第 N 次搭建SSM框架呢? 刚学习java的时候,搭建 SSM 框架想做一个个人项目之类的,后来没搭起来,也就拖延了,进入公司之后,接触的第一个项目就是SSM的,模仿了一下,也能搭个简简单单的 ...
- python+matplotlib+绘制不同图标类型
#==================================================================#首先需要导入两个文件import matplotlib.pypl ...
- Python使用ProtoBuffer
Python使用ProtoBuffer Protocol Buffers,是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储.通信协议等方面. 就可读性而言感 ...
- vue+element-ui之tree树形控件有关子节点和父节点之间的各种选中关系详解
做后端管理系统,永远是最蛋疼.最复杂也最欠揍的事情,也永远是前端开发人员最苦逼.最无奈也最尿性的时刻.蛋疼的是需求变幻无穷,如同二师兄的三十六般变化:复杂的是开发难度寸步难行,如同蜀道难,难于上青天: ...