信号量

【Python成长之路】来聊聊多线程的几位“辅助”

早过忘川 提交于 2020-01-22 19:27:07
哈喽大家好,我是鹏哥。 今天想写写的内容是 —— 多线程的几位“辅助”英雄 。 ~~~上课铃~~~ Jiaye&<em>Tonylgy</em>-Astronomia(Remix)[DubstepVer.]- Astrornomia(DubstepVer.) 1 写在前面 最近新赛季上分好艰难,我的火都督都胜率连败,哎,要是有个优秀的辅助该有多好。 回到正题,之前我写过一篇多线程和多进程的文章: 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍 今天我再补充讲讲多线程的多位“辅助英雄”: 锁、信号量、事件。 2 多线程示例 在介绍几位多线程方法前,我们先回归下多线程的使用。 在不使用各类方法时,多线程代码的结果为: 运行时间为15S(5S为主函数等待时间,10S是子线程运行运行时间),即3个线程是同时运行的。 另外,从结果中,可以看到多线程之间是随机运行的,可以说是相当混乱。 缺点:当前多个子线程存在相互抢占资源,会出现同一秒内同时打印hello的情况;另外子线程之间是乱序的,没有先来后到。 注:不知道为什么,微信公众号里设置代码功能不生效,因此只能截图了 3 锁示例 针对多线程里的锁方法,其实是将第一个子线程在运行时,将其他线程进行上锁,不让他们运行。有点像游乐场里,小朋友们在玩滑梯时,工作人员将他们一个个排队分好,在其中一个小朋友在玩时

pthread线程知识要点

匆匆过客 提交于 2020-01-22 14:49:43
pthread线程知识要点 线程之间通信的两个基本问题是互斥和同步。` #include<pthread.h> 一、pthread_create 1、函数原型 int pthread_create(pthread_t tidp,const pthread_attr_t attr,(void )( start_rtn)(void ),void arg); 2、函数功能: pthread_create是类Unix操作系统(Unix、Linux、Mac OS X等)的创建线程的函数。 它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。 返回成功时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于指定各种不同的线程属性。 新创建的线程从start_rtn函数的地址开始运行,该函数只有一个万能指针参数arg, 如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。 3、返回值: 表示成功,返回0;表示出错,返回-1。 4、参数 第一个参数为指向线程标识符的指针。 第二个参数用来设置线程属性。 第三个参数是线程运行函数的起始地址。 最后一个参数是运行函数的参数。 示例: // 线程的运行函数 void say_hello(void args) {

限流的介绍以及限流的代码实现

夙愿已清 提交于 2020-01-21 05:27:11
限流的介绍以及限流的实现 什么是限流 常用的限流方式 信号量 令牌桶 什么是限流 限流就是对某一段时间窗口内的请求数进行控制,保持系统的可用性和稳定性。 防止因为流量的暴增而导致系统奔溃。 很多平台都有限流,例如我们调用第三方的api的时候,对方都会限制每天最多只能调用几次之类的。 常用的限流方式 1)信号量 2)令牌桶 信号量 Semaphore是一个计数信号量。常用于限制获取某资源的线程数量, 可用java的 Semaphore 实现。 原理就是先定义总共有多少个信号量,然后每个线程进来拿到几个信号量才可以成功访问,这样就允许了同时有多少个线程访问。 例如,定义了6个信号量,每个线程进来拿2个,那么同时允许3个线程成功访问。 通过acquire()方法获取许可,该方法会阻塞,直到获取许可为止。 通过release()方法释放许可。 代码实现如下 @RestController @RequestMapping ( "/semaphore" ) public class SemaphoreController { //初始化信号量=5,true-公平信号量FIFO。 private Semaphore semaphore = new Semaphore ( 5 , true ) ; //该方法是阻塞的,直到获取许可为止 @RequestMapping ( "/acquire/

Hystrix中文开发手册-Hystrix简介(Home)

杀马特。学长 韩版系。学妹 提交于 2020-01-21 04:10:55
Hystrix 是什么 ? 为什么要使用Hystrix? Hystrix 可以解决什么问题? Hystrix 的设置原则是什么? Hystrix 如何实现这些设计目标? Hystrix 是什么? 在分布式的环境中, 一些分布式服务会不可避免的出现的依赖项目发生错误的情况。 Hystrix 就是一个可以通过使用 延时策略 和 故障容错逻辑 帮助您管理控制这些__分布式服务之间交互__的一个库. Hystrix 通过 服务隔离 ,停止故障服务级联调用并提供应急(最常见的各种no fallback available异常出自这里)计划来改善系统的弹性. Hystrix的历史 Hystrix源自Netflix API团队于2011年开始的弹性工程工作。2012年,Hystrix不断发展和成熟,Netflix内部的许多团队都采用了它。如今,每天在Netflix上通过Hystrix执行数百亿个线程隔离和数千亿个信号量隔离的调用。这极大地提高了正常运行时间和弹性。 为什么要使用Hystrix? Hystrix 的设计宗旨 : 为第三方系统访问(通常是指通过网络) 中发送的延时和错误(例如:服务数据库异常)提供保护和控制. 终止复杂分布式系统中的级联故障 . 快速失败(熔断)和快速恢复. 回退(fallback) 并且在可能的情况下进行服务降级. 启用近乎实时的监视,警报和操作控制.

进程同步与通信

倾然丶 夕夏残阳落幕 提交于 2020-01-21 00:06:55
进程同步与通信 操作系统教程: http://c.biancheng.net/cpp/html/2592.html 进程的同步与互斥是指进程在推进时的相互制约关系。 # 进程同步 :它主要源于进程合作,是进程间共同完成一项任务时直接发生相互作用的关系。为进程之间的直接制约关系。如生产者-消费者问题,哲学家进餐问题。 # 进程互斥 :它主要源于资源共享,是进程之间的间接制约关系。在多道系统中,每次只允许一个进程访问的资源称为临界资源,进程互斥就是保证每次只有一个进程使用临界资源。如访问控制台、打印机。 为禁止两个进程同时进入临界区,同步机制应遵循以下准则: 空闲让进:临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。 忙则等待:当已有进程进入临界区时,其他试图进入临界区的进程必须等待。 有限等待:对请求访问的进程,应保证能在有限时间内进入临界区。 让权等待:当进程不能进入临界区时, 应立即释放处理器,防止进程忙等待 。 进程同步和互斥在不同的系统中有不同的实现。 Windows中的进程同步方法有信号量、事件,互斥方法有临界区、互斥锁。 Linux中的进程同步方法有?? 互斥方法有?? 信号量是一种功能较强的机制, 可用来解决互斥与同步 的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也可以记为“P操作”和“V操作”。 Wait 原语的实现 void

linux下的进程间通信概述

老子叫甜甜 提交于 2020-01-21 00:06:03
管道(PIPE) FIFO(有名管道) XSI消息队列 XSI信号量 XSI共享内存 POSIX信号量 域套接字(Domain Socket) 信号(Signal) 互斥量(Mutex) 其中信号(signal)和信号量(semaphore)本质上并不算是进程间通信方式,应该是进程间同步的方式,但是也可以起到一定的通信作用,故也列在上面。另外普通的mutex是作用线程间同步用的,但是可以将进程A和进程B共享的内存中初始化一个mutex,这样就可以用将此mutex用作进程间通信用了。 各种通信方式的比较和优缺点 管道:速度慢,容量有限,只有父子进程能通讯,是最基本的进程间通信。 FIFO:任何进程间都能通讯,但速度慢 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 信号量:不能传递复杂消息,只能用来同步 共享内存区:能够很容易控制容量,是速度最快的进程间同步方式,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存 各种方法适用场景 : 1. 管道: 只能用于具有亲缘关系的进行通信,使用面相对较窄,实际开发中较少使用。管道和FIFO最适合在进程之间实现生产者/消费者的交互; 2. FIFO(命名管道)

进程,线程通信与同步

谁都会走 提交于 2020-01-21 00:04:48
原文链接 1.0 Linux进程间通讯 管道/FIFO:管道中还有命名管道和非命名管道(即匿名管道)之分,非命名管道(即匿名管道)只能用于父子进程通讯,命名管道可用于非父子进程,命名管道就是FIFO,管道是先进先出的通讯方式 消息队列:消息队列是用于两个进程之间的通讯,首先在一个进程中创建一个消息队列,然后再往消息队列中写数据,而另一个进程则从那个消息队列中取数据. 需要注意的是,消息队列是用创建文件的方式建立的,如果一个进程向某个消息队列中写入了数据之后,另一个进程并没有取出数据,即使向消息队列中写数据的进程已经结束,保存在消息队列中的数据并没有消失,也就是说下次再从这个消息队列读数据的时候,就是上次的数据!!!! 信号量:信号量,它与WINDOWS下的信号量是一样的,所以就不用多说了 共享内存:共享内存,类似于WINDOWS下的DLL中的共享变量,但LINUX下的共享内存区不需要像DLL这样的东西,只要首先创建一个共享内存区,其它进程按照一定的步骤就能访问到这个共享内存区中的数据,当然可读可写 信号:signal 套接字socket IPC比较 1.管道:速度慢,容量有限,只有父子进程能通讯 2.FIFO:任何进程间都能通讯,但速度慢 3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题 4.信号量:不能传递复杂消息,只能用来同步 5.共享内存

进程与线程

半腔热情 提交于 2020-01-20 23:59:51
进程模型   计算机上所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程,简称 进程。一个进程就是一个正在执行程序的实例。包括程序计数器、计数器和当前变量的值。     CPU在进程之间快速来回切换被称作是多道程序设计。    进程的创建     四种事件会导致进程的创建       1.系统初始化       2.正在运行的程序执行了创建进程的系统调用。       3.用户创建一个新进程。       4.一个批处理作业的初始化。   守护进程:停留在后台处理诸如电子邮件、WEB页面、新闻、打印之类活动的进程成为守护进程。      在UNIX和Windows中,进程创建之后,父进程和子进程有各自不同的地址空间    进程的终止     1.正常退出(自愿的)     2.出错退出(自愿的)     3.严重错误(非自愿)     4.被其它进程杀死(非自愿)      进程的结构层次     UNIX:树     Windows: 没有进程层次概念,所有的进程层次相同,唯一类似的是,创建子进程的时候,父进程得到一个特别的令牌(句柄),可以用来控制子进程,但它有权把句柄传给其它进程,这样就不存在进程层次,UNIX中则不能剥          夺子进程的继承权。   进程的状态           进程的实现:         操作系统维护这一张表格(一个结构数组)

并发编程——进程同步

我是研究僧i 提交于 2020-01-20 23:53:11
锁——multiprocess.Lock:   加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,会牺牲了速度却保证了数据安全。   虽然可以用文件共享数据实现进程间通信,但问题是:   1,效率低。2,需要自己加锁处理。 multiprocess模块为我们提供的基于消息的IPC通信机制:队列和管道。   队列和管道都是将数据存放于内存中:   队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,我们应该避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可扩展性。 import os import time import random from multiprocessing import Lock from multiprocessing import Process def work(n,lock): lock.acquire() print('%s:%s is running' % (n,os.getpid())) time.sleep(random.random()) print('%s:%s is done' % (n,os.getpid())) lock.release() if __name__ == '__main__': lock = Lock()

小熊派华为物联网操作系统 LiteOS内核教程04-信号量

拈花ヽ惹草 提交于 2020-01-18 11:52:00
1. LiteOS内核的信号量 1.1.信号量 在多任务操作系统中,不同的任务之间需要同步运行,信号量功能可以为用户提供这方面的支持。信号量(Semaphore)是一种实现任务间通信的机制,实现任务之间同步或临界资源的互斥访问。 1.2. 信号量的使用方式 信号量可以被任务获取或者申请,不同的信号量通过信号量索引号来唯一确定,每个信号量都有一个计数值和任务队列。 通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数,其值的含义分两种情况: 0:表示没有积累下来的 Post 操作,且有可能有在此信号量上阻塞的任务; 正值:表示有一个或多个 Post 下来的释放操作; 当任务申请(Pend)信号量时,如果申请成功,则信号量的计数值递减,如若申请失败,则挂起在该信号量的等待任务队列上,一旦有任务释放该信号量,则等待任务队列中的任务被唤醒开始执行。 1.3. 信号量的使用场景 信号量是一种非常灵活的同步方式,可以运用在多种场合中,实现锁、同步、资源计数等功能,也能方便的用于任务与任务,中断与任务的同步中。 互斥锁 用作互斥时,信号量创建后记数是满的,在需要使用临界资源时,先申请信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法申请到信号量而阻塞,从而保证了临界资源的安全。 任务间同步 用作同步时,信号量在创建后被置为空,任务1申请信号量而阻塞