文章目录

  • Event同步对象
  • semaphore信号量
  • 队列

本篇是关于Python进程方面的内容了,主要是Event同步对象,信号量和队列

Event同步对象

1、概念:
我们可以对一个线程set一个值来等待,在等待期间,其他线程都不能继续往下执行,直到这个值被clear,其他的线程才能接着往下执行

就比如考试,监考老师进入教室,一群学生开始考试;
然后只有老师说停笔,你才能够走出考场;
即使你卷子已经做完了,也得等着老师的通知才能离开。

2、测试代码:

import threading,time#老师类
class Teacher(threading.Thread):def run(self):print("老师:开始考试,今天考到12:30!")print(event.isSet())  #查看是否有设置值#开始设置值event.set()  time.sleep(5)  #设置标准考试时间为5秒钟#老师的动作print("老师:12:30到了,考试结束!")#老师的动作结束了,所以再次查看是否设置了值还是Falseprint(event.isSet())  #再次查看是否设置了值event.set()#学生类
class Student(threading.Thread):def run(self):event.wait()print("学生:唉,开考了......")time.sleep(1)  #假设学生考试只花1秒中event.clear()  #清除event.wait()print("学生:终于考完了......")if __name__=="__main__":#实例化一个Event对象event=threading.Event()L= []for i in range(5):L.append(Student())L.append(Teacher())#启动线程for t in L:t.start()for t in L:t.join()

3、测试结果:

可以看到,几个学生同时开考,等老师这个任务结束后,这群学生才可以结束

semaphore信号量

1、引用概念:

信号量用来控制可以同时开启线程的个数,BoundedSemaphore或Semaphore管理一个内置的计数 器,每当调用acquire()时-1,调用release()时+1。

计数器不能小于0,当计数器为 0时,acquire()将阻塞线程至同步锁定状态,直到其他线程调用release()。(类似于停车位的概念)

BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release()时检查计数器的值是否超过了计数器的初始值,如果超过了将抛出一个异常。

2、测试代码:

import threading,time#继承线程的类
class MyThread(threading.Thread):def run(self):if semaphore.acquire():print(self.name)  #输出线程名time.sleep(5)  #睡5秒,每一个线程都会停留5秒#释放信号量semaphore.release() if __name__=="__main__":#设置信号量,为5表明可以一次性执行的线程是5个semaphore=threading.Semaphore(5)L= []for i in range(100):L.append(MyThread())for t in L:  #启动线程t.start()

3、测试结果:

可以看到,线程每五个五个得出来

队列

1、先进先出型:

import queue  #导入线程队列L= []#创建线程队列对象
q= queue.Queue(5)
#能装5个对象的队列(不指定,则任意大小),block=False表示队列满了会提示错误信息#在线程队列放入值
q.put([1,233333])
q.put([2,'little girl'])
q.put([3,{'name':'初音'}])
#q.put({'name2':'初音2'})#取值
while True:data= q.get(block=True)#block=False表示如果卡住了会提示错误,#因为该线程队列已经没有数据可以取了,所以会提示队列空的信息print(data,'------')

2、先进后出型:

import queue#后进先出队列
q= queue.LifoQueue()#在线程队列放入值
q.put([1,233333])
q.put([2,'little girl'])
q.put([3,{'name':'初音'}])#取值
while True:data= q.get(block=False)#block=False表示如果卡住了会提示错误,#因为该线程队列已经没有数据可以取了,所以会提示队列空的信息print(data,'-----')队列的其他方法
import queue#创建队列
q= queue.Queue()#在线程队列放入值
q.put([1,233333])
q.put([2,'little girl'])
q.put([3,{'name':'初音'}])#取值
print(q.qsize())  #队列值的个数
print(q.empty())  #是否为空
print(q.full())  #是否满
q.task_done()

Python之进程+线程+协程(同步对象、信号量、队列)相关推荐

  1. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)

    文章目录 一.IO多路复用 二.selectors模块 本篇文字是关于IO多路复用的更深入一步的总结,上一篇 Python之进程+线程+协程(事件驱动模型.IO多路复用.select与epoll)对I ...

  2. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...

  3. Python之进程+线程+协程(事件驱动模型、IO多路复用、select与epoll)

    文章目录 一.事件驱动模型 二.IO多路复用 本篇文章是关于涉及网络编程与协程.进程之间结合的内容,其中事件驱动模型.IO多路复用.select与epoll的使用等方面的知识 一.事件驱动模型 1.事 ...

  4. Python之进程+线程+协程(multiprocessing多进程模块)

    前几篇的多线程模块的各种规则和用法,本篇则是关于多进程模块的内容 1.multiprocessing的介绍 在Python中,由于有GIL解释器锁的存在,多线程就根本不是本质意义上的多线程,而是一个主 ...

  5. Python之进程+线程+协程(进程的本质 与 threading线程模块)

    文章目录 基本概念 threading线程模块 本篇开始分析Python中的并发程序,也就是进程.线程.协程序的使用.由于是用自己的语言总结的,因此比较大白话,或者叫通俗易懂.而且很多细节方面没有具体 ...

  6. Python之进程+线程+协程(进程间通信、进程同步、进程池、回调函数)

    文章目录 进程间通信 进程同步 进程池 回调函数 本篇文章依然是进程.线程方面的内容,主要讲进程间的通信.进程队列.进程同步.进程池.进程同步和回调函数 进程间通信 进程就是两个独立的内存空间在运行, ...

  7. Python之进程+线程+协程(生产者消费者模型)

    本篇主要总结一下非常有名的生成者消费者模型 概念引用 1.为什么要使用生产者和消费者模型? 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快, ...

  8. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

  9. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

最新文章

  1. 用 C 语言开发一门编程语言 — 异常处理
  2. 看了新闻,思科研发中心 没有成都的。。。
  3. IAAS云计算产品畅想-云主机产品内涵
  4. 数据库及中间件术语解释
  5. 苹果笔记本电脑好用吗_苹果这些让人超疑惑的配件,价格超贵而且真的好用吗?...
  6. LeetCode刷题(44)--Remove Duplicates from Sorted Array II
  7. scrapy爬虫+echarts数据分析(安居客)
  8. Android-导航栏特效-新闻类APP(仿iOS版网易新闻今日头条的文字渐变缩放特效)
  9. PC蓝牙加串口调试助手调试蓝牙设备
  10. Win11怎么设置鼠标箭头图案?Win11更换鼠标图案的方法
  11. windows/linux多系统并存体验
  12. <Safari浏览器插件>使json代码能格式化显示
  13. Java微信开发入门第一节(PC端、移动端、微信端区别)
  14. python运势预测程序_运势.py · Scar/Python-Spider - Gitee.com
  15. 俄罗斯方块是java_俄罗斯方块(java版)
  16. linux共享实体机硬盘,实现目录共享
  17. 三颗锦囊用完,苹果新iPad今年挡得住两大集团军吗?
  18. 2021年电工(初级)实操考试视频及电工(初级)理论考试
  19. 对于拓扑空间的一些理解
  20. shell编程之正则表达式与总结(grep,egrep)与文件处理器和总结(sed,awk,sort,uniq)

热门文章

  1. python qt gui快速编程_《PYTHON QT GUI快速编程 PYQT编程指南》源码
  2. php 给富文本里的图片增加ALT、TITLE属性
  3. ubuntu mysql ftp_Ubuntu服务器安装ftp服务和MySQL数据库配置的一些记录
  4. java对图像的解压_java – 将图像解压缩到blobstore中
  5. android onresume函数,android – 使用onResume()刷新活动
  6. java 弹性碰撞_球体弹性碰撞位置和速度计算算法
  7. 你修改了样式,却要我手动清除游览器缓存,这是BUG!
  8. 解决ERROR 1044 (42000): Access denied for user
  9. Activity中四大启动模式
  10. 基于JAVA+SpringMVC+Mybatis+MYSQL的医学药品信息管理系统