0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析线程的信号量和进程的信号量用法

冬至配饺子 来源:多兰多 作者:Toranto 2022-08-19 10:56 次阅读

信号量-Semaphore

线程的信号量和进程的信号量用法无异:

pYYBAGL--g-AO_BzAACWToGWcWQ982.png
poYBAGL--hSAaxxiAADdZ2xDWhs986.png

事件-Event

通过event类将两个方法连接起来进行沟通:

poYBAGL--jOAT8DWAADQVZsrcs0599.pngpYYBAGL--jmAJUpxAADOSHuAf9I332.png

线程池-ThreadPoolExecutor

线程池和进程池用法是几乎无异的,但是要注意它导入的模块,提交的方法,参数的填写方法,以及关闭的方法:

pYYBAGL--lmAcSNWAACp_ffExrU976.pngpoYBAGL--l6Ab_5iAAEkdhtQ5c4710.png

如果涉及返回值的时候呢?

直接打印的话会打印出一串内存地址(自己尝试)这时候需要调用.result方法(第14行)

poYBAGL--nqAErMQAAC6VzwrZFc462.pngpYYBAGL--n-AcAkrAACY2TFzDTY877.png

但是我们从结果上看,程序变成了一个同步程序,大大降低了我们的效率。这时候我们可以采用新建列表的方式来进行优化:

pYYBAGL--pyATtBsAADiP20ScmM706.pngpoYBAGL--qKAJrIvAAC_Qt_Jq94780.png

协程-greenlet

我们都知道:

①进程是计算机中最小的资源分配单位·

②线程是计算机中能被cpu调度的最小单位

现在有一个问题:能开启的线程和进程是有限的,但是我们要处理的任务是无限的。比如我现在有5万个任务要执行,难道我去开5万个线程吗?然后假设我开了300个线程,但是这300个线程都阻塞了,我仍然没有充分利用CPU,(理想的情况是开启一个线程,没有IO只有计算,这叫充分利用CPU,但大多数的情况不是这样的,多多少少会有一些阻塞情况),这时候协程(纤程)就派上用场了。一条线程在多个任务之间来回切换,切换这个动作是需要浪费时间的,但是对于CPU、操作系统来说,协程是不存在的,它们只能看见最小单位即线程。把一个线程的工作分成了好几个任务,在多个任务中来回切换的现象称为协程。

pYYBAGL--ryATGHIAABArqsJgks044.png

写一个简单地生产者消费者模型:

poYBAGL--syAbqrPAABXjKwQRKQ878.png

①协程能把一个线程的执行明确的区分开

②两个任务,协程帮助我记住哪个任务执行到哪个位置上了,并且实现安全的切换

③一个任务不得不陷入阻塞了,在这个任务阻塞的过程中切换到另一个任务继续执行

④你的程序只要还有任务需要执行你的当前线程永远不会阻塞

⑤利用协程在多个任务陷入阻塞的时候进行切换,来保证一个线程在处理多个任务的时候总是在忙碌

⑥能够更加充分的利用cpu,抢占更多的时间片

⑦无论是进程还是线程都是由操作系统来切换的,开启过多的线程、进程会给操作系统的调度增加负担

⑧如果我们是使用的协程,协程在程序之间的切换操作系统感知不到

⑨无论开启多少个协程对操作系统来说总是一个线程在执行,操作系统的调度不会有任务的压力

⑩协程的本质就是一条线程,所以完全不会产生数据安全的问题。

对于协程所需要用到的模块主要有两个,greenlet和gevent,其中greenlet是gevent的底层逻辑模块,主要控制协程的切换(手动),gevent可以当做是greenlet的升级版,功能比greenlet更加全面,需要安装,安装后即可直接使用。

poYBAGL--vOAZ4vwAACPSqJkLSc706.png

pYYBAGL--vmAG9b7AACnPY5Q7bc444.png

可以看出,greenlet.switch可以帮助程序员手动切换阻塞,但是如果想要自动切换还需要用到gevent。

协程-gevent

gevent就是greenlet的完善版:

pYYBAGL--xiAKwhCAAB7_oR4tOc581.png

pYYBAGL--xyAS3_XAAFuvRBCWD8583.png

但是我们如果把gevent.sleep换成time.sleep呢?

pYYBAGL--0GAIE9bAAB_-F9bTi0348.png

poYBAGL--0aAQKthAAFmgOCzaOQ262.png

很明显,阻塞没有被识别到,所以我们需要用到导入monkey,这样就能将一些常见的阻塞识别。

poYBAGL--2yARDGdAACiydKdiiA635.png

pYYBAGL--3OAHC2bAAFtL0x2oYk432.png




审核编辑:刘清




声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 线程池
    +关注

    关注

    0

    文章

    57

    浏览量

    6834
  • 线程
    +关注

    关注

    0

    文章

    504

    浏览量

    19651
  • 信号量
    +关注

    关注

    0

    文章

    53

    浏览量

    8314
收藏 人收藏

    评论

    相关推荐

    Linux下进程通讯之信号量

    信号量集,就是由多个信号量组成的一个数组。 作为一个整体, 信号量集中所有的信号量使用同一个等待队列。 Linux 的信号量集为
    的头像 发表于 08-19 19:55 2006次阅读
    Linux下<b class='flag-5'>进程</b>通讯之<b class='flag-5'>信号量</b>集

    FreeRTOS信号量使用教程

    信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步, FreeRTOS中信号量又分为二值信号量、 计数型信号量、互斥
    的头像 发表于 12-19 09:22 3114次阅读
    FreeRTOS<b class='flag-5'>信号量</b>使用教程

    信号量用法

    本帖最后由 chenshuihong 于 2016-4-22 11:28 编辑 信号量的分配,信号量的分配,信号量的分配,信号量的分配
    发表于 04-22 11:27

    LabVIEW信号量

    LabVIEW信号量信号量是一种用来限制可以同时取用共享(受保护)资源的任务数量方法。受保护的资源或关键代码部分可能包括写入全局变量或与外部仪器进行通信。您可以使用信号量使您的代码线程
    发表于 04-09 21:52

    信号量机制怎么理解

    信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,线程必须获取一个
    发表于 11-14 09:23 2.6w次阅读
    <b class='flag-5'>信号量</b>机制怎么理解

    你了解Linux 各类信号量

    内核信号量与用户信号量,用户信号量分为POXIS信号量和SYSTEMV信号量,POXIS信号量
    发表于 05-04 17:19 2492次阅读
    你了解Linux 各类<b class='flag-5'>信号量</b>?

    信号量和自旋锁

    ------------------------------------------------------    Linux中的信号量是一种睡眠锁。如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让
    发表于 04-02 14:43 798次阅读

    Linux IPC System V 信号量

     立即销毁指定的信号量集,调用的进程的的effective UID必须和信号量集的创建者或所有者相匹配,或者这个进程有足够的特权级别,此时第四个参数会被忽略IPC_INFO(Linux
    发表于 04-02 14:46 319次阅读

    Linux 多线程信号量同步

    直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;
    发表于 04-02 14:47 385次阅读

    Linux信号量(2):POSIX 信号量

    上一章,讲述了 SYSTEM V 信号量,主要运行于进程之间,本章主要介绍 POSIX 信号量:有名信号量、无名信号量。 POSIX
    的头像 发表于 10-29 17:34 690次阅读

    ThreadX(六)------信号量semaphore

    信号量semphere概述
    发表于 12-28 19:26 7次下载
    ThreadX(六)------<b class='flag-5'>信号量</b>semaphore

    使用二进制信号量取代任务通知

    二进制信号量只有0和1,两个任务公用一个信号量,一个任务用于产生信号量(即对信号量+1),另一个任务使用此信号量(即对
    的头像 发表于 09-15 09:22 843次阅读

    FreeRTOS的二值信号量

    FreeRTOS中的信号量是一种任务间通信的方式,信号量包括:二值信号量、互斥信号量、计数信号量,本次实验只使用二值
    的头像 发表于 02-10 15:07 1460次阅读

    Free RTOS的计数型信号量

    上篇讲解了二值信号量,二值信号量只能判断有无,而不能确定事件发生的次数,因此我们为了确定事件的次数引入了计数型信号量
    的头像 发表于 02-10 15:29 997次阅读
    Free RTOS的计数型<b class='flag-5'>信号量</b>

    使用Linux信号量实现互斥点灯

    信号量常用于控制对共享资源的访问,有计数型信号量和二值信号量之分。初始化时信号量值大于1的,就是计数型信号量,计数型
    的头像 发表于 04-13 15:12 788次阅读
    使用Linux<b class='flag-5'>信号量</b>实现互斥点灯