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 ...
随机推荐
- mysql免解压版的配置
很多朋友在安装mysq解压版l时出现: “mysql 服务无法启动 服务没报告任何错误” 以前我安装时也是遇到这样的问题: 其实mysql在5.6后就没有了data目录,很多朋友按照以前的版本安装会去 ...
- 大数据学习之Linux基础01
大数据学习之Linux基础 01:Linux简介 linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ...
- idea使用阿里工具优化代码+阿里开发手册
idea安装工具 打开插件安装界面 File-Settings-Plugins-Browse repositories... 搜索Alibaba Java Coding Guidelines 进行安装 ...
- flask 中使用 socket 遇到的坑
很久没用博客园了,最近涉及到一个问题,需要向前端推送日志 考虑的方案两个,一个是定时ajax 但是这样效率太慢了,二是用socket 那看看有没有轮子咯,面向百度编程,有两个库可以使用 1.flask ...
- CSS特例定位方式
同级向下一个元素定位,一个+表示下一个元素,++表格下下个元素 input[name='name1'] +input td:eq(0)表示第一个td元素,此定位方式限于执行js,在selenium时用 ...
- 2019-3-22KeyDown,KeyPress 和 KeyUp 事件
研究了一下KeyDown,KeyPress 和 KeyUp 的学问.让我们带着如下问题来说明: 1.这三个事件的顺序是怎么样的? 2.KeyDown 触发后,KeyUp是不是一定触发? 3.三个事件的 ...
- 我的 FPGA 学习历程(10)—— 实验:数码管驱动
根据黑金 AX301 手册,数码管位选信号命名为 SEL[5:0],其中 SEL[5] 对应最左边的数码管,而SEL[0] 对应最右边数码管:作为约定,在下面的描述中我们对应的称之为数码管 5 和数码 ...
- [Ubuntu]Firefox书签Ubuntu与Windows同步
Ubuntu默认使用Firefox国际版.其他平台访问官网下载到的都是中国版,而国际版和中国版使用两套账号体系,相互之间无法同步,导致Ubuntu的Firefox无法和其他平台的Firefox同步书签 ...
- (lua) 基于cocos 的插入光效
具体的表现是:移动滚动容器到头部, 新增icon淡入并掉入格子,显示格子中的图标,icon放大并淡出 function UISkyResource:playActivedEffect(id) then ...
- js的算法题
1.统计一个字符串中出现最多的字母 给出一个字符串,统计出现次数最多的字母.如:“wqeqwhixswiqhdxsq”,其中出现最多的是q. js算法的实现 function findMax(str) ...