zoukankan      html  css  js  c++  java
  • python--threading多线程

    题记

    threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。python当前版本的多线程库没有实现优先级、线程组,线程也不能被停止、暂停、恢复、中断。

    threading模块提供的类:

    Thread, Lock, Rlock, Condition, [Bounded]Semaphore, Event, Timer, local。
    

    threading 模块提供的常用方法:

    threading.currentThread(): 返回当前的线程变量。 
    threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。 
    threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
    

    threading 模块提供的常量:

    threading.TIMEOUT_MAX 设置threading全局超时时间。
    

    Thread类

    Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run():

    创建线程的两种方法

    构造方法:

    Thread(group=None, target=None, name=None, args=(), kwargs={})

    group: 线程组,目前还没有实现,库引用中提示必须是None; 
    target: 要执行的方法; 
    name: 线程名; 
    args/kwargs: 要传入方法的参数。
    

    实例方法:

    isAlive(): 返回线程是否在运行。正在运行指启动后、终止前。 
    get/setName(name): 获取/设置线程名。 
    
    start():  线程准备就绪,等待CPU调度
    is/setDaemon(bool): 获取/设置是后台线程(默认前台线程(False))。(在start之前设置)
    
    	如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,主线程和后台线程均停止
    	如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止
    
    start(): 启动线程。 
    join([timeout]): 阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的timeout(可选参数)。
    

    实例

    # coding:utf-8
    import threading
    import time
    #方法一:将要执行的方法作为参数传给Thread的构造方法
    def action(arg):
        time.sleep(1)
        print 'the arg is:%s
    ' %arg
    
    for i in xrange(4):
        t =threading.Thread(target=action,args=(i,))
        t.start()
    
    print 'main thread end!'
    
    #方法二:从Thread继承,并重写run()
    class MyThread(threading.Thread):
        def __init__(self,arg):
            super(MyThread, self).__init__()#注意:一定要显式的调用父类的初始化函数。
            self.arg=arg
        def run(self):#定义每个线程要运行的函数
            time.sleep(1)
            print 'the arg is:%s
    ' % self.arg
    
    for i in xrange(4):
        t =MyThread(i)
        t.start()
    
    print 'main thread end!'
    

    Lock、Rlock类

    由于线程之间随机调度:某线程可能在执行n条后,CPU接着执行其他线程。为了多个线程同时操作一个内存中的资源时不产生混乱,我们使用锁。

    Lock(指令锁)是可用的最低级的同步指令。Lock处于锁定状态时,不被特定的线程拥有。Lock包含两种状态——锁定和非锁定,以及两个基本的方法。

    可以认为Lock有一个锁定池,当线程请求锁定时,将线程至于池中,直到获得锁定后出池。池中的线程处于状态图中的同步阻塞状态。

    RLock(可重入锁)是一个可以被同一个线程请求多次的同步指令。RLock使用了“拥有的线程”和“递归等级”的概念,处于锁定状态时,RLock被某个线程拥有。拥有RLock的线程可以再次调用acquire(),释放锁时需要调用release()相同次数。

    可以认为RLock包含一个锁定池和一个初始值为0的计数器,每次成功调用 acquire()/release(),计数器将+1/-1,为0时锁处于未锁定状态。

    简言之:Lock属于全局,Rlock属于线程。

    构造方法:

    Lock(),Rlock(),推荐使用Rlock()
    

    实例方法:

    acquire([timeout]): 尝试获得锁定。使线程进入同步阻塞状态。 
    release(): 释放锁。使用前线程必须已获得锁定,否则将抛出异常。
    

    实例

    # coding:utf-8
    
    import threading
    import time
    
    gl_num = 0
    
    lock = threading.RLock()
    
    
    # 调用acquire([timeout])时,线程将一直阻塞,
    # 直到获得锁定或者直到timeout秒后(timeout参数可选)。
    # 返回是否获得锁。
    def Func():
        lock.acquire()
        global gl_num
        gl_num += 1
        time.sleep(1)
        print gl_num
        lock.release()
    
    
    for i in range(10):
        t = threading.Thread(target=Func)
        t.start()
    
    使用Lock
    

    Event类

    Event(事件)是最简单的线程通信机制之一:一个线程通知事件,其他线程等待事件。Event内置了一个初始为False的标志,当调用set()时设为True,调用clear()时重置为 False。wait()将阻塞线程至等待阻塞状态。

    Event其实就是一个简化版的 Condition。Event没有锁,无法使线程进入同步阻塞状态。

    构造方法:

    Event()
    

    实例方法:

    isSet(): 当内置标志为True时返回True。 
    set(): 将标志设为True,并通知所有处于等待阻塞状态的线程恢复运行状态。 
    clear(): 将标志设为False。 
    wait([timeout]): 如果标志为True将立即返回,否则阻塞线程至等待阻塞状态,等待其他线程调用set()。
    

    实例

    # encoding: UTF-8
    import threading
    import time
    
    event = threading.Event()
    
    
    def func():
        # 等待事件,进入等待阻塞状态
        print '%s wait for event...' % threading.currentThread().getName()
        event.wait()
    
        # 收到事件后进入运行状态
        print '%s recv event.' % threading.currentThread().getName()
    
    
    t1 = threading.Thread(target=func)
    t2 = threading.Thread(target=func)
    t1.start()
    t2.start()
    
    time.sleep(2)
    
    # 发送事件通知
    print 'MainThread set event.'
    event.set()
    

    timer类

    Timer(定时器)是Thread的派生类,用于在指定时间后调用一个方法。

    构造方法:

    Timer(interval, function, args=[], kwargs={})

    interval: 指定的时间 
    function: 要执行的方法 
    args/kwargs: 方法的参数
    

    实例方法:

    Timer从Thread派生,没有增加实例方法。
    

    更多入门教程可以参考 (http://www.bugingcode.com/python_start/)

  • 相关阅读:
    安装Oracle 11g时遇到“【INS-13001】此环境不满足最低配置”的问题解决
    Oracle 11g安装过程
    关于.ipynb文件
    Mysql连接驱动与Java之间的版本不匹配问题(Mysql-connector-java与Java、Mysql版本对应关系)
    Markdown基础语法
    华为2019开发者大会内容小记
    Python开发:NumPy学习(一)ndarray数组
    POJ 1011 -- Sticks
    POJ 2362 -- Square
    POJ 3414 -- Pots
  • 原文地址:https://www.cnblogs.com/bugingcode/p/8277035.html
Copyright © 2011-2022 走看看