标签分类
技术文章
当前位置:主页 > 计算机编程 > python > Python线程下条件变量的用法

Python线程下条件变量的实例用法

  • 发布时间:
  • 作者:码农之家原创
  • 点击:62

Python线程下条件变量的用法

这篇文章主要知识点是关于Python,线程,变量,实例用法,Python线程下条件变量的用法,的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Python文本分析
Python文本分析原书中文版
  • 类型:Python编程大小:100.4 MB格式:PDF出版:机械工业出版社作者:迪潘简
立即下载

更多相关的学习资源可以参阅 程序设计电子书Python电子书、等栏目。

本篇文章给大家带来的内容是关于Python线程中条件变量的用法,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

 

条件变量时构建在另一个锁上的同步原语,当需要线程关注特定的状态变化或事件发生时将使用这个锁。典型的用法是生产者与消费者问题,其中一个线程生产的数据提供给另外一个线程使用。

语法:

c=Condition(lock)
穿件新的条件变量。lock时可选的Lock或RLock的实例。如果未提供lock参数,就会创建新的RLock实例供条件变量使用。

常用方法:

c.acquire(*args):获取底层锁。此方法将调用底层锁上对应的acquire(*args)方法。

c.release():释放底层锁。此方法将调用底层锁上对应的release()方法

c.wait(timeout):等待直到获取通知或出现超时为止。此方法在调用线程已经获取锁之后调用。
调用时,将释放底层锁,而且线程将进入睡眠状态,直到另一个线程在条件变量上执行notify()或notify_all()方法将其唤醒为止。
在线程被唤醒后,线程讲重新获取锁,方法也会返回。timeout是浮点数,单位为秒。
如果超时,线程将被唤醒,重新获取锁,而控制将被返回。

c.notify(n):唤醒一个或多个等待此条件变量的线程。此方法只会在调用线程已经获取锁之后调用,
而且如果没有正在等待的线程,它就什么也不做。
n指定要唤醒的线程数量,默认为1.被唤醒的线程在它们重新获取锁之前不会从wait()调用返回。

c.notify_all():唤醒所有等待此条件的线程。

实例模版:使用条件变量

#条件变量实例
from threading import Condition

c=Condition()
def producer():
    while True:
        c.acquire()
        #生产东西
        ...
        c.notify()
        c.release()

def consumer():
    while True:
        c.acquire()
        while 没有可用的东西:
            c.wait()#等待出现
        c.release()
        #使用生产的东西
        ...

注意:如果存在多个线程等待同一个条件,notify()操作会唤醒他们中的一个或多个(这种行为取决于底层的操作系统)。因此,始终有这样的可能:某个线程被唤醒后,缺发现它等待的条件不存在了,这解释了为什么在consumer函数中使用while循环,如果线程醒来,但是生成的项已经消失,它就会回去等待下一个信号。

相关推荐:

关于条件变量、线程的10篇文章推荐

浅析Python多线程下的变量问题

以上就是Python线程下条件变量的用法的详细内容,更多请关注码农之家其它相关文章!

以上就是本次给大家分享的全部知识点内容总结,大家还可以在下方相关文章里找到vue项目中使用md5加密以及、 解决axios.interceptors.respon、 儿童python编程入门书籍推、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:Python字符串模板知识点总结

下一篇:python调试中print()和断言实例讲解

展开 +

收起 -

学习笔记
网友NO.466641

python主线程捕获子线程的方法

最近,在做一个项目时遇到的了一个问题,主线程无法捕获子线程中抛出的异常。 先看一个线程类的定义 ''''' Created on Oct 27, 2015 @author: wujz ''' import threading class runScriptThread(threading.Thread): def __init__(self, funcName, *args): threading.Thread.__init__(self) self.args = args self.funcName = funcName def run(self): try: self.funcName(*(self.args)) except Exception as e: raise e 很简单,传入要调用的方法,并启用一个新的线程来运行这个方法。 在主线程中,启动这个线程类的一个对象时,这要声明一个对象然后启动就可以了,示例如下 import runScriptThread,traceback if __name__=='__main__': sth = 'hello world' try: aChildThread = runScriptThread(printSth, sth) aChildThread.start() aChildThread.join() except Exception as e: print(str(traceback.format_exc())) 但是这样的代码,main方法中无法捕获子线程中的异常,原因在于start()方法将为子线程开辟一条新的栈,main方法的栈因此无法捕获到这一异常。 解决方法很简单,就是通过设置一个线程是否异常退出的flag的成员变量,当线程异常退出时,对其作一标记。然后在主线程中检查改线程运行结束后该标志位的值,如果异常,再通过sys和traceback回溯异常信息,然后抛出即可。改写后的异常类: ''''' Created on Oct 27, 2015 @author: wujz ''' import threading,traceback,sys class runScriptThread(threading……

网友NO.845642

Python自定义线程池实现方法分析

本文实例讲述了Python自定义线程池实现方法。分享给大家供大家参考,具体如下: 关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程。但多线程处理IO密集的任务效率还是可以杠杠的。 我实现的这个线程池其实是根据银角的思路来实现的。 主要思路: 任务获取和执行: 1、任务加入队列,等待线程来获取并执行。 2、按需生成线程,每个线程循环取任务。 线程销毁: 1、获取任务是终止符时,线程停止。 2、线程池close()时,向任务队列加入和已生成线程等量的终止符。 3、线程池terminate()时,设置线程下次任务取到为终止符。 流程概要设计: 详细代码: import threadingimport contextlibfrom Queue import Queueimport timeclass ThreadPool(object): def __init__(self, max_num): self.StopEvent = 0#线程任务终止符,当线程从队列获取到StopEvent时,代表此线程可以销毁。可设置为任意与任务有区别的值。 self.q = Queue() self.max_num = max_num #最大线程数 self.terminal = False #是否设置线程池强制终止 self.created_list = [] #已创建线程的线程列表 self.free_list = [] #空闲线程的线程列表 self.Deamon=False #线程是否是后台线程 def run(self, func, args, callback=None): """ 线程池执行一个任务 :param func: 任务函数 :param args: 任务函数所需参数 :param callback: :retur……

网友NO.701556

python多线程并发让两个LED同时亮的方法

在做毕业设计的过程中,想对多个传感器让他们同时并发执行。之前想到 light_red() light_blue() 分别在两个shell脚本中同时运行,但是这样太麻烦了。后来学到了Python多线程,让程序并发执行。 下面具体介绍步骤: 两个led灯,一个蓝灯,一个红灯 蓝灯正极接13,负极接14 红灯正极接12,负极接14 下面是代码: #!/usr/bin/python# -*- coding: UTF-8 -*- import RPi.GPIO as GPIOimport threadingimport time class led_blue(threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 print "Starting " + self.name led_blue_on() print "Exiting " + self.name class led_red (threading.Thread): #继承父类threading.Thread def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 print "Starting " + self.name led_red_on() print "Exiting " + self.name def led_blue_on(): PIN_NO=13 GPIO.setmode(GPIO.BOARD) GPIO.setup(PIN_NO, GPIO.OUT) GPIO.output(PIN_NO,GPIO.HIGH)def led_red_on(): PIN=12 GPIO.setmode(GPIO.BOARD) GPIO.setup(PIN, GPIO.OUT) GPIO.output(PIN,GPIO.HIGH) # 创建新线程thread1 = ……

网友NO.223046

什么是python线程模块?九种方法助你了解线程模块

对于第一次接触到python这门编程语言的朋友来说,刚刚开始学习 python线程模块 的时候,对于 python中线程模块 这一方面的了解比较少,在这篇文章之中我们就来了解关于python线程模块的知识吧。废话不多说,我们开始学习线程模块吧。 什么是线程模块 Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。 threading 模块提供的其他方法: 1.threading.currentThread(): 返回当前的线程变量。 2.threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 3.threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。 除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法: 1.run(): 用以表示线程活动的方法。 2.start():启动线程活动。 3.join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。 4.isAlive(): 返回线程是否活动的。 5.getName(): 返回线程名。 6.setName(): 设置线程名。 使用使Threading模块创建线程 使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法: # !/usr/bin/python#……

<
1
>

Copyright 2018-2019 xz577.com 码农之家

版权责任说明