Python2.7 threading模块学习

    主要学习一下python的多线程编程,使用threading模块,threading 包括:Thread、conditions、event、rlock、semaphore等类。

    Thread对象可以实例化一个线程t,在创建t线程时,可以将t的主函数作为一个参数传递进去(target=),或者创建Thread的子类覆盖run方法。在Thread实例化线程t后,t并没有运行,要想让t线程活动,必须启动t,t.start()即可,一旦t是活动的,t将在其主函数结束时结束。在Thread实例化一个线程时必须指定target。

Thread的方法如下:

       getname可以返回线程t的名称,setname设置线程t的名称
       isalive 判断一个线程是否是活动的,也就是线程状态在t.start和t.run之间
       isdaemon/setdaemon 如果线程t是一个驻留程序(即使t是活动的,python也可以终止整个处理过程,也会将t结束),isdaemon返回ture,仅当创建t的线程是一个驻留程序时,线程t才是一个驻留程序,这样只能在t.start()之前调用t.setdaemon来设置t为一个驻留程序。
       join 其他调用线程(非t)会直接挂起,直到t结束,只能在t.start之后调用t.join
       run run是运行线程t主函数的方法,thread的子类通常会覆盖run,如果不被覆盖,run将调用在创建t时传递的target参数,通过t.start()调用t.run
       start t.start()让线程t活动


线程同步对象:
      timeout 在event和condition中都有一个可以接收一个可选的timeout参数作为wait方法
      lock/rlock threading的lock和thread的lock一样,rlock是一个重入锁,在r被锁定时,r将跟踪所有者(锁定r的哪个)线程,所有者线程可以再次调用r.acquire而不会出现阻塞,r只是将内部计数器加1。而lock则会永远阻塞。
       condition 创建返回一个condition对象c,c可以包装一个lock或者rlock对象L,acquire/release 这些方法将调用L的对应方法,前提是一个线程拥有对L的锁。notify/notifyall notify可以唤醒正在等待c的线程中的某一个线程,调用线程在调用c.notify()之前必须拥有L,并且notify不会释放L。调用线程通常会在调用notify之后调用release。
       wait wait将释放L,然后挂起调用线程,直到其他线程对c调用notify
       event对象可以让任意数量的线程挂起并等待。

threading模块提供了一个local类,称为TLS,在一个线程中做的任何更改不会对其他线程产生影响

编程代码如下:

#!/usr/bin/python
import sys
import time
import threading

b=50
l=threading.Lock()

def threadcode():
    global b
    print "Thread %s invoke" % threading.currentThread().getName()
    l.acquire()
    try:
        print "Thread %s is running" % threading.currentThread().getName()
        time.sleep(30)
        b=b+50
        print "Thread %s set b to %d" % (threading.currentThread().getName(),b)
    finally:
        l.release()

print "Value of b at start program:",b

childthread=[]
for i in range(1,5):
    t=threading.Thread(target=threadcode,name="Thread-%d" % i)
    t.start()
    childthread.append(t)
for i in childthread:
    t.join()

print "New value of b:",b

测试图如下:



转载于:https://my.oschina.net/guol/blog/93273

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值