python多线程编程5

互斥锁是最简单的线程同步机制,python提供的condition对象提供了对复杂线程同步问题的支持。condition被称为条件变量,除了提供与lock类似的acquire和release方法外,还提供了wait和notify方法。线程首先acquire一个条件变量,然后判断一些条件。如果条件不满足则wait;如果条件满足,进行一些处理改变条件后,通过notify方法通知其他线程,其他处于wait状态的线程接到通知后会重新判断条件。不断的重复这一过程,从而解决复杂的同步问题。

可以认为Condition对象维护了一个锁(Lock/RLock)和一个waiting池。线程通过acquire获得Condition对象,当调用wait方法时,线程会释放Condition内部的锁并进入blocked状态,同时在waiting池中记录这个线程。当调用notify方法时,Condition对象会从waiting池中挑选一个线程,通知其调用acquire方法尝试取到锁。

Condition对象的构造函数可以接受一个Lock/RLock对象作为参数,如果没有指定,则Condition对象会在内部自行创建一个RLock。

除了notify方法外,Condition对象还提供了notifyAll方法,可以通知waiting池中的所有线程尝试acquire内部锁。由于上述机制,处于waiting状态的线程只能通过notify方法唤醒,所以notifyAll的作用在于防止有线程永远处于沉默状态。

演示条件变量同步的经典问题是生产者与消费者问题:假设有一群生产者(Producer)和一群消费者(Consumer)通过一个市场来交互产品。生产者的”策略“是如果市场上剩余的产品少于1000个,那么就生产100个产品放到市场上;而消费者的”策略“是如果市场上剩余产品的数量多余100个,那么就消费3个产品。用Condition解决生产者与消费者问题的代码如下:

立即学习“Python免费学习笔记(深入)”;

import threadingimport time  class Producer(threading.Thread):    def run(self):        global count        while True:            if con.acquire():                if count > 1000:                    con.wait()                else:                    count = count+100                    msg = self.name+' produce 100, count=' + str(count)                    print msg                    con.notify()                con.release()                time.sleep(1)  class Consumer(threading.Thread):    def run(self):        global count        while True:            if con.acquire():                if count 

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2284510.html

(0)
上一篇 2025年2月27日 20:47:00
下一篇 2025年2月23日 18:30:41

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python获得本机硬件信息

    注意:这段代码需要wmi  和 系统 win32 扩展支持。 没安装库的要先下载安装,我装的是 WMI-1.4.6.win32 和 pywin32-218.win32-py2.7 还有,代码里面文件目录自己修改下咯。 # -*- codin…

    2025年2月27日
    200
  • python多线程编程4: 死锁和可重入锁

    死锁 在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子: # encoding: UTF-8import threadi…

    编程技术 2025年2月27日
    200
  • python多线程编程3: 使用互斥锁同步线程

    问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系。现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1。很容易写出这样的代码: # encoding: UTF-…

    编程技术 2025年2月27日
    200
  • Python多线程抓取Google搜索链接网页

    1)urllib2+beautifulsoup抓取goolge搜索链接 近期,参与的项目需要对Google搜索结果进行处理,之前学习了Python处理网页相关的工具。实际应用中,使用了urllib2和beautifulsoup来进行网页的抓…

    2025年2月27日
    200
  • 计算机语言入门先学什么

    对于计算机语言入门初学者,首先需要掌握计算机基础、算法和数据结构,然后选择一种入门级编程语言,如 Python、Java 或 C++,并系统学习其语法和基本概念。 计算机语言入门先学什么? 对于初学者来说,学习计算机语言入门时,首先需要掌握…

    2025年2月27日
    000
  • python多线程编程2

    如上一节,python的threading.thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通过thread类的start方法,可以启动该线程,交给python虚拟机进行调度,…

    编程技术 2025年2月27日
    200
  • python多线程编程1

    多线程编程必须理解的一些基本概念,适用于所有编程语言。内容: 并发式编程 多任务操作系统 多线程vs多进程 线程安全 立即学习“Python免费学习笔记(深入)”; 线程的生命周期 线程的类型 并发式编程 不同的编程范式对软件有不同的视角。…

    编程技术 2025年2月27日
    200
  • 使用Python读取和写入mp3文件的id3v1信息

    1.起因 一直以来疯迷“冬吴相对论”,为了整理下载他的MP3花了不少功夫,今天突然发现将电脑中的mp3导入到itunes后,文件名竟然不识别了。#_* itunes自动识别了mp3的信息内容。多次一举么,文件名挺好。事实如此,让我深感不完美…

    编程技术 2025年2月27日
    200
  • Python连接Redis连接配置

    系统环境: OS:Oracle Linux Enterprise 5.6 redis:redis-2.6.8 python:Python-2.7.3 redis的python包版本:redis-2.7.2.tar 立即学习“Python免费…

    编程技术 2025年2月27日
    200
  • Python 支持重启的异步 IO

    摘要 这是一份从Python3.3开始的Python3异步I/O提议。研究从PEP 3153缺失的具体提议。 这提议包括了一个可插入式的事件循环API,传输和与Twisted相似的协议抽象,以及来自(PEP 380) 基于yield的更高级…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论