互斥锁

Python-多线程

梦想的初衷 提交于 2020-03-08 13:01:47
多线程 线程拥有自己独立的栈和共享的堆,共享堆,不共享栈,线程亦由操作系统调度(标准线程是的)。   thread在python3中被废弃了   python3中threading代替thread模块   为了兼容性 python3将thread改名为 “_thread”   python的标准库提供了两个模块 ,_thread(低级模块) 和 threading(高级模块) 1.threading 启动一个线程就是把一个函数传入并创建threading.Thread( )实例,然后调用start( )开始执行: import threading #导入线程模块 import time #线程函数 def foo(num): print('我的进程名字为:'+threading.current_thread().name) time.sleep(2) print(num) #创建进程 #callback:回调函数 一般用来接收子进程运行函数的返回值 t1 = threading.Thread(target=foo,args=(1,),callback=func) t2 = threading.Thread(target=foo,args=(2,)) #启动线程 t1.start() t2.start() #获取线程运行状态 True为运行 False为未运行 print(t1.is

java锁学习

為{幸葍}努か 提交于 2020-03-08 08:04:38
锁从设计理念上可分为2类,分别为悲观锁(互斥锁)和乐观锁(非互斥锁) 悲观锁适用于写多读少的场景,乐观锁适用于读多写少的场景 java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。 java中主要锁有2种实现方式,分别是jvm虚拟机实现的(Synchronized关键字)和JDK 代码实现的(Lock接口实现等java.util.concurrent.locks包下的锁) Synchronized实现的锁是一种互斥锁(一次最多只能有一个线程持有的锁,当一个线程持有该锁的时候其它线程无法进入上锁的区域),它是一种悲观锁 synchronized最早只有重量级锁,在jdk1.6中对Synchronized进行了优化。 在编译器层面,使用了锁消除(对一些没有必要的、不会引起安全问题的同步代码取消同步)和锁粗化(对那些多次执行同步的代码且它们可以可并到一次同步的代码) 同时引进了适应性自旋锁,偏向锁,轻量级锁,这3种锁属于乐观锁。 jdk1.6中是默认开启偏向锁和轻量级锁的 Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。 锁可以升级但不能降级,这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 偏向锁:(Mark

多线程的安全隐患

吃可爱长大的小学妹 提交于 2020-03-04 08:28:13
资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象、同一个变量、同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 安全隐患分析: 安全隐患的解决——互斥锁: 互斥锁使用格式 @synchronized(锁对象) { // 需要锁定的代码 } 注意:锁定1份代码只用1把锁,用多把锁是无效的 互斥锁的优缺点: 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源 互斥锁的使用前提: 多条线程抢夺同一块资源 相关专业术语: 线程同步 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务) 互斥锁,就是使用了线程同步技术 原子和非原子属性: OC在定义属性时有 nonatomic 和 atomic 两种选择 atomic :原子属性,为 setter 方法加锁(默认就是 atomic ) nonatomic :非原子属性,不会为 setter 方法加锁 nonatomic 和 atomic 对比 atomic :线程安全,需要消耗大量的资源 nonatomic :非线程安全,适合内存小的移动设备 iOS开发的建议 所有属性都声明为 nonatomic 尽量避免多线程抢夺同一块资源 尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力 来源: https:/

惊群现象

风格不统一 提交于 2020-03-03 05:57:30
惊群 所谓惊群即:多个进程/线程同时阻塞等待同一个事件的发生,如果这个事件发生,那么会唤醒所有进程/线程,但是却只有一个进程/线程会对该事件进行处理,那么其他唤醒的进程/线程会继续休眠阻塞,从而造成性能浪费,这种现象即为惊群。 accept惊群 最常见的即,服务器进程在listen后fork出多个子进程来阻塞accept客户端发起连接,当客户端发起连接时,所有子进程将被唤醒,但是实际上只有一个进程可以获取该连接,而其他进程继续阻塞, 不过新版的linux已经解决了这个问题,即唤醒最先阻塞的进程来获取该连接 epoll惊群 第一种情况是在fork之前创建epollfd,然后主进程fork多个子进程,每个子进程将listenfd加入到epollfd中,当一个连接到来会触发epoll惊群,多个子进程的epoll会被同时触发。造成惊群,不过新版的epoll已经解决了此问题 第二种情况是主进程创建listenfd,主进程创建多个子进程,同时每个子进程有自己的epollfd,每个子进程将listenfd加入到epollfd中,这样当一个连接到来时,会触发惊群,有待解决。NGINX中使用互斥锁和主动的方式去解决惊群问题解决了该惊群问题 nginx解决惊群问题的方法是在每次循环到epoll_wait时,几个子进程竞争互斥锁,获得互斥锁的子进程则将监听fd加到epoll中

互斥锁

旧街凉风 提交于 2020-03-02 21:04:58
守护进程 什么是守护进程 进程是一个正在运行的程序 守护进程也是一个普通进程 意思是一个进程可以守护另一个进程 例如 康熙要是一个进程的话,后宫佳丽都是守护者 如果康熙挂了, 后宫佳丽们要陪葬 结论: 如果b是a的守护进程,a是被守护的进程,a要是挂了,b也就随之结束了 # 案例1from multiprocessing import Process import time ​ # 妃子的一生 def task(): print("入宫了.....") time.sleep(50) print("妃子病逝了......") ​ ​ if __name__ == '__main__': # 康熙登基了 print("登基了.....") ​ # 找了一个妃子 p = Process(target=task) ​ # 设置为守护进程 必须在开启前就设置好 p.daemon = True p.start() ​ # 康熙驾崩了 time.sleep(3) print("故事结束了!") 使用场景: 父进程交给了子进程一个任务,任务还没有完成父进程就结束了,子进程就没有继续执行的意义了 例如:qq 接收到一个视频文件,于是开启了一个子进程来下载,如果中途退出了qq,下载任务就没必须要继续运行了 互斥锁 什么是互斥锁 互斥锁 互相排斥的锁,我在这站着你就别过来,(如果这个资源已经被锁了

GO语言并发

对着背影说爱祢 提交于 2020-03-02 19:03:52
并发与并行 并发:同一时间段执行多个任务 并行:同一时刻执行多个任务 Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时调度完成,而线程是由操作系统调度完成。 Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是 Go 语言秉承的 CSP(Communicating Sequential Process)并发模式的重要实现基础。 goroutine goroutine 的概念类似于线程,但 goroutine 由 Go 程序运行时的调度和管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go语言之所以被称为现代化的编程语言,就是因为它在语言层面已经内置了调度和上下文切换的机制。 使用goroutine Go 程序中使用go关键字为一个函数创建一个goroutine。一个函数可以被创建多个 goroutine,一个goroutine必定对应一个函数。 启动单个goroutine 在调用的函数(普通函数和匿名函数)前面加上一个go关键字。 func hello() { fmt.Println("Hello ares!") } func main() { hello()

python学习笔记之使用threading模块实现多线程(转)

做~自己de王妃 提交于 2020-03-02 12:35:43
综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势。 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看Python对多线程编程的支持。 在语言层面,Python对多线程提供了很好的支持,可以方便地支持创建线程、互斥锁、信号量、同步等特性。下面就是官网上介绍threading模块的基本资料及功能: 实现模块 thread:多线程的底层支持模块,一般不建议使用; threading:对thread进行了封装,将一些线程的操作对象化 threading模块 Thread 线程类,这是我们用的最多的一个类,你可以指定线程函数执行或者继承自它都可以实现子线程功能; Timer与Thread类似,但要等待一段时间后才开始运行; Lock 锁原语,这个我们可以对全局变量互斥时使用; RLock 可重入锁,使单线程可以再次获得已经获得的锁; Condition 条件变量,能让一个线程停下来,等待其他线程满足某个“条件”; Event 通用的条件变量

线程之线程同步

风流意气都作罢 提交于 2020-03-01 12:51:01
本文来自个人博客: https://dunkwan.cn 文章目录 线程同步 互斥量 函数`pthread_mutex_timedlock` 读写锁 带有超时的读写锁 条件变量 自旋锁 屏障 线程同步 互斥量 互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行设置,在访问完成后释放互斥量。互斥量使用 pthread_mutex_t 数据类型表示的。在使用互斥量以前,必须首先对它进行初始化,可以把它设置为常量 PTHREAD_MUTEX_INITIALIZER (只适用于静态分配的互斥量),也可以通过调用 pthread_mutex_init 函数进行初始化。如果动态分配互斥量(例如通过调用 malloc 函数),在释放内存前需要调用 pthread_mutex_detroy 。 # include <pthread.h> int pthread_mutex_init ( pthread_mutex_t * restrict mutex , const pthread_mutexattr_t * restrict attr ) ; int pthread_mutex_destroy ( pthread_mutex_t * mutex ) ; 两个函数的返回值:若成功,返回 0 ;否则,返回错误编号。 要用默认的属性初始化互斥量,只需把 attr 设为 NULL 。

Python:使用threading模块实现多线程(转)

ぐ巨炮叔叔 提交于 2020-02-29 08:58:11
Python:使用threading模块实现多线程(转) 分类: python 标签: thread 评论: 暂无评论 阅读:5,420 views 综述 Python这门解释性语言也有专门的线程模型,Python虚拟机使用GIL(Global Interpreter Lock,全局解释器锁)来互斥线程对共享资源的访问,但暂时无法利用多处理器的优势。 在Python中我们主要是通过thread和 threading这两个模块来实现的,其中Python的threading模块是对thread做了一些包装的,可以更加方便的被使用,所以我们使用 threading模块实现多线程编程。这篇文章我们主要来看看Python对多线程编程的支持。 在语言层面,Python对多线程提供了很好的支持,可以方便地支持创建线程、互斥锁、信号量、同步等特性。下面就是官网上介绍threading模块的基本资料及功能: 实现模块 thread:多线程的底层支持模块,一般不建议使用; threading:对thread进行了封装,将一些线程的操作对象化 threading模块 Thread 线程类,这是我们用的最多的一个类,你可以指定线程函数执行或者继承自它都可以实现子线程功能; Timer与Thread类似,但要等待一段时间后才开始运行; Lock 锁原语,这个我们可以对全局变量互斥时使用; RLock

19.Go语言基础之并发

感情迁移 提交于 2020-02-25 15:32:04
1.1并发与并行 并发:同一时间段执行多个任务(使用微信和多个朋友聊天) 并行:同一时刻执行多个任务(windows中360在杀毒,同时你也在写代码) Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。 goroutine是由Go语言的运行时(runtime)调度完成,而线程是由操作系统调度完成。 Go语言还提供channel在多个goroutine间进行通信。goroutine和channel是Go语言秉承的CSP(Communication Sequential Process)并发模式的重要实现基础。 1.2goroutine 在java/Python中,我们实现并发编程的时候,通常需要自己维护一个线程池,并且需要自己去包装一个又一个的任务,同时需要自己去调度线程执行任务并维护上下文切换,这一切需要耗费很多。 Go语言中的goroutine,类似于线程,但goroutine是由Go的运行时(runtime)调度和管理的。Go程序能够只能的将goroutine中的任务合理的分配到每个CPU。Go语言被称为现代化语言的原因,就是因为Go在语言层面就已经内置了调度和上下文切换的机制。 在Go语言编程中,不需要自己写进程、线程、协程,你的技能只有一个,就是goroutine。 1.2