原标题:Python实现线程安全队列

作者:愤怒的屎壳螂

来源:http://blog.csdn.net/hit0803107/article/details/52876143

最近学习spark,我主要使用pyspark api进行编程。

之前使用Python都是现学现用,用完就忘了也没有理解和记忆,因此这里把Python相关的知识也弥补和记录下来吧

多线程任务队列在实际项目中非常有用,关键的地方要实现队列的多线程同步问题,也即保证队列的多线程安全

例如:可以开多个消费者线程,每个线程上绑定一个队列,这样就实现了多个消费者同时处理不同队列上的任务

同时可以有多个生产者往队列发送消息,实现异步消息处理

先复习下互斥量和条件变量的概念:

互斥量(mutex)从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁以后,任何其他试图再次对互斥锁加锁的线程将会阻塞直到当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥锁加锁,其他线程将会看到互斥锁依然被锁住,只能回去再次等待它重新变为可用。

条件变量(cond)是在多线程程序中用来实现"等待--》唤醒"逻辑常用的方法。条件变量利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程等待"条件变量的条件成立"而挂起;另一个线程使“条件成立”。为了防止竞争,条件变量的使用总是和一个互斥锁结合在一起。线程在改变条件状态前必须首先锁住互斥量,函数pthread_cond_wait把自己放到等待条件的线程列表上,然后对互斥锁解锁(这两个操作是原子操作)。在函数返回时,互斥量再次被锁住

条件变量总是与互斥锁一起使用的

Python的threading中定义了两种锁:threading.Lock和threading.RLock

两者的不同在于后者是可重入锁,也就是说在一个线程内重复LOCK同一个锁不会发生死锁,这与POSIX中的PTHREAD_MUTEX_RECURSIVE也就是可递归锁的概念是相同的, 互斥锁的API有三个函数,分别执行分配锁,上锁,解锁操作。

python的threading中的条件变量默认绑定了一个RLock,也可以在初始化条件变量的时候传进去一个自己定义的锁.

最后贴出我自己实现的简单线程安全任务队列

测试代码

————金三银四课程特惠————

马哥教育精英线下Linux班郑州校区开班倒计时,优惠四重享,赠送高达4000元的学习大礼包:

第一重:4月30日前报名,立减400元,名额有限抢完为止;

第二重:4月30日前报名,赠送马哥教育内部Linux知识精讲教材一本(价值666元);

第三重:4月30日前报名,赠送马哥教育实体服务器使用资格(价值1666元);

第四重:4月30日前报名,赠送马哥教育云学堂学习权限1个(价值1999元);

课程详情,请咨询学习顾问:

马哥教育一号学习顾问老师,懂IT更懂IT男。

专注解决Linux技术难题,是天生的技术专家。

如果你正好遇到了问题,为什么不找她求助一下?

豌豆

Linux面授班,报名优惠400元,名额有限,抢完为止!返回搜狐,查看更多

责任编辑:

python 线程安全队列_Python实现线程安全队列相关推荐

  1. python 线程池回收_python实现线程池

    这段时间一直在做一个爬虫系统,用python和django实现.其中涉及到了多线程的问题,在后端使用一个全局的字典用来保存和识别已经运行的线程.但是觉得这样的实现不是不太舒服.于是想找到一个更好的实现 ...

  2. python异步线程算法应用_Python多线程----线程池以及线程实现异步任务

    了解异步编程 楼主在工作中遇到了以下问题,开发接口爬取数据代码完成之后要写入redis缓存,但是在写入缓存的过程花费2-3s,进行这样就大大影响了接口的性能,于是想到了使用异步存储. 传统的同步编程是 ...

  3. python异步io 队列_python 学习笔记九 队列,异步IO

    queue (队列) 队列是为线程安全使用的. 1.先入先出 import queue #测试定义类传入队列class Foo(object): def __init__(self,n): self. ...

  4. python环形队列_Python 实现数据结构-循环队列的操作方法

    今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...

  5. python中线程和进程_python中线程和进程的简单了解

    一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合. 3 ...

  6. python线程和c++线程的区别_Python、线程、吉尔和C++

    有没有办法让boost::python控制每次与python交互的python GIL?在 我正在用boost::python编写一个项目.我试图为外部库编写C++包装,并用Python脚本控制C++ ...

  7. python线程池原理_Python定时器线程池原理详解

    这篇文章主要介绍了Python定时器线程池原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定时器执行循环任务: 知识储备 Timer(int ...

  8. python 栈和队列_Python实现栈和队列的简单操作方法示例

    本文实例讲述了Python实现栈和队列的简单操作方法.分享给大家供大家参考,具体如下: 先简单的了解一下数据结构里面的栈和堆: 栈和队列是两种基本的数据结构,同为容器类型.两者根本的区别在于: sta ...

  9. python 栈和队列_python实现栈和队列

    栈(Stack),也叫做堆栈, 是一种容器, 可存入数据元素.访问元素.删除元素,它的特点在于只能允许在容器的一端(称为栈顶端指标,英语:top)进行加入数据(英语:push)和输出数据(英语:pop ...

最新文章

  1. 编程控制Word文档中Table的赋值
  2. Hungarian method 匈牙利算法 解决指派问题
  3. 井下三专两闭锁的内容_矿用高压防爆开关:煤矿井下高低压防爆开关五防电子锁保护装置...
  4. php根据时间段分组,php按月分组(时间戳)
  5. MiniGUI细节处理(转)
  6. SAP S/4 HANA与SAP Business Suite/R3(ECC)的区别
  7. CentOS下升级python2.7.10过程记录
  8. c语言编2048,c语言编写的2048游戏代码,大家可以参考一下这些
  9. lamp mysql5.0_CentOS 5/6 LAMP(Apache MySQL PHP)一键安装脚本
  10. dj鲜生-10200818-商品首页展示-静态页下载资源
  11. -bash-退出_为什么这么多开发人员在找到工作之前就退出了。 请-不要。
  12. TimeUnit类中的sleep() 和Thread.sleep()
  13. vscode写c++好吗_寒假实习简历你会写吗?四个问题帮你写好寒假实习简历
  14. 用简单Mask分类实现语义分割、实例分割“大一统”!FacebookUIUC开源MaskFormer
  15. ERP源码 跨境电商ERP源码 Java电商ERP源码
  16. 施耐德c语言编程软件,施耐德PLC讲座 IEC语言梯形图
  17. TeamTalk 线程池详解
  18. vue设置必填项和判断必填项是否填入的弹窗提示
  19. vue中使用萤石云播放视频
  20. 直角坐标系转球坐标系 Equirectangular 理解 代码 Unity

热门文章

  1. service层的作业+mybatis中的重要组件
  2. 计算机求职英语作文,英语作文_计算机专业大学毕业生求职信范文_沪江英语
  3. 让更多的人知道如何用C#操作斑马条码打印机
  4. Linux标识第2个扩展分区,精益创业模式与Get Big Fast模式、火箭发射思维模式,对创业假定的不同在于它认为( )。...
  5. python package 之 jenkins
  6. 雨量水位监测站 水情监测
  7. C语言零基础入门习题(八)四则运算
  8. mysql分区(partition)
  9. 【关于微阵列芯片和RNA-seq的比较】
  10. python 课后习题:项目二数据分析之《冰与火之歌》全五卷人物关系图