python多线程学习备忘录

来源:互联网 发布:淘宝女装拍摄 云南 编辑:程序博客网 时间:2024/05/17 02:40

python提供了thread 和 threading 两个多线程模块。threading高级一些,大多数博客介绍的都是这个。

1.threading模块

threading模块提供的方法:
- threading.current_thread()–返回当前线程的实例
threading.Thread线程类
进程默认会启动一个线程,即主线程,名称为”MainThread”。主线程可以创建其他子线程,子线程创建时默认的名称为”Thread-i” i表示第几个。
(1)创建线程
创建线程有两种方法:
1)通过继承Thread类并重写run函数
2)通过构造函数传入要运行的函数
Thread(group=None, target=None, name=None, args=(), kwargs={})
- group未实现
- target为要执行的方法
- name为线程名
- args对应target方法的参数

import threading#导入模块import time#通过target参数传入要执行的方法def actions(arg):    time.sleep(1)    print 'thread %s '%argfor i in xrange(5):    t=threading.Thread(target=actions,args=(i,))    t.start()#通过继承Thread类并重写run函数class MyThread(threading.Thread):    def __init__(self,arg):        #必须显式的调用父类的初始化函数        super(MyThread,self).__init__()        self.arg=arg    def run(self):        time.sleep(1)        print 'thread %s'%self.argfor i in xrange(5):    t=MyThread(i)    t.start()

2.Thread类

Thread类提供的方法:
- start()–启动线程
- join()–等待至线程终止
- getName()–返回线程名称
- setName()–设置线程名称
- isAlive()–返回线程是否在运行
- setDaemon()–设置守护进程,必须在start()之前调用。
python中thread的一些机制和C/C++不同:在C/C++中,主线程结束后,其子线程会默认被主线程kill掉。而在python中,主线程结束后,会默认等待子线程结束后,主线程才退出。
(1) 设置setDaemon()
默认setDaemon(False),则该线程为用户线程。主线程执行完毕后,等待所有线程都执行完,程序再退出。
setDaemon(True),设置线程为守护线程(也有称之为后台线程)。主程序执行完毕后,不论守护线程是否执行完,程序退出。
下面通过程序示例里展示setDeamon()的功能

#未设置setDeamon(),setDeamon(False)默认为Falseimport threadingprint 'thread %s is running'%threading.current_thread().namedef actions(arg):    sleep(1)    print 'thread %s is running\n'%threading.current_thread().name    print 'thread %s \n'%arg    sleep(1)for i in xrange(5):    t=threading.Thread(target=actions,args=(i,))    t.start()print 'thread %s is running'%threading.current_thread().name

运行结果

thread MainThread is runningthread MainThread is endedthread Thread-1 is runningthread 0thread Thread-5 is runningthread Thread-4 is runningthread Thread-3 is runningthread Thread-2 is runningthread 4thread 3thread 2thread 1#可以看出主线程MainThread结束后,其他线程任然继续执行。直到所有线程执行完,程序退出

设置setDaemon(True)

import threadingprint 'thread %s is running'%threading.current_thread().namedef actions(arg):    sleep(1)    print 'thread %s is running\n'%threading.current_thread().name    print 'thread %s \n'%argfor i in xrange(5):    t=threading.Thread(target=actions,args=(i,))    t.setDaemon(True)    t.start()print 'thread %s is running'%threading.current_thread().name

运行结果

thread MainThread is runningthread MainThread is ended#可以看出,设置子线程为守护线程,主线程执行完毕后,直接退出程序,不管守护线程的执行状况。

(2)join()阻塞当前上下文环境的线程,直到调用该方法的线程终止或到达timeout。如果主线程设置了setDaemon(True)依然要等待子线程结束。

print 'thread %s is running'%threading.current_thread().namedef actions(arg):    sleep(1)    print 'thread %s is running\n'%threading.current_thread().name    print 'thread %s \n'%arg    sleep(1)threads=[]for i in xrange(5):    t=threading.Thread(target=actions,args=(i,))    t.setDaemon(True)    threads.append(t)for t in threads:    t.start()for t in threads:    t.join()print 'thread %s is ended'%threading.current_thread().name

运行结果

thread MainThread is runningthread Thread-3 is runningthread Thread-5 is runningthread Thread-4 is runningthread Thread-2 is runningthread Thread-1 is runningthread 2thread 4thread 3thread 1thread 0thread MainThread is ended#设置join()后,主线程等待所有子线程完成执行或超时后再结束。

【join()方法使得线程可以等待另一个线程的运行,而setDaemon()方法使得主线程在结束时不等待子线程。join和setDaemon都可以改变线程之间的运行顺序】
参考博客:

3.线程同步

当多个线程对同一个数据项进行修改,就需要锁来保证数据的正确性。通过threading模块的Lock和Rlock类来实现。
Lock和Rlock类
这两个类都有acquire方法(获得锁)和release方法(释放锁)
Lock–只有锁定和非锁定两种状态,不能重复acquire
Rlock–可以被同一个线程acquire多次,但acquire和release必须成对出现

  • http://www.runoob.com/python/python-multithreading.html
  • http://www.cnblogs.com/tkqasn/p/5700281.html
  • http://f.dataguru.cn/thread-170832-1-1.html
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 腌牛肉太咸了怎么办 八宝粥的拉环断了怎么办 八宝粥易拉罐拉环断了怎么办 吃完辣的胃难受怎么办 天天呆在家很烦怎么办 吃多了荔枝上火怎么办 猛犸牙牌子裂了怎么办 玩游戏电脑卡了怎么办 电脑打开卡在选项界面怎么办? 红警突然卡死怎么办 柯基不吃狗粮怎么办 貔貅嘴巴磕破了怎么办 开光貔貅牙磕了怎么办 玉貔貅鼻子碎了怎么办 开光的貔貅摔坏了怎么办 貔貅摔坏了耳朵怎么办? 貔貅摔坏了一点点怎么办 天猫删评价扣4分怎么办 暴风影音下载电视剧下载不了怎么办 fm2017引援电脑买了怎么办 退休时医保不够二十年怎么办 和的面迟迟不发怎么办 做面条的面发了怎么办 发不起来的面团怎么办 如果婚后买房离婚后财产怎么办 空腹体检前喝水了怎么办 莆田市风俗婴儿死了怎么办后事 上司给你换不好岗位怎么办 领导要把我调走怎么办 美国上庭遇法官退休案子怎么办 夫妻一套房离婚户囗怎么办 正营生不了副团怎么办 浅色衣服被染色了怎么办 解大便解不出来怎么办 强拆挖掘机被村民扣押怎么办 小孩哭的时候接不上气怎么办 昆明市长信箱发不出去怎么办 中国公民在香港想去澳门怎么办 面包车不给贴膜怎么办 在香港海关被扣怎么办 发现被医院骗了怎么办