昨天学习的多线程,今天总结一下,巩固一下
python中提供thread 和 threading模块对多线程提供支持,其中threading模块是对thread模块的封装,多数情况下使用threading来进行多线程编程
1.第一种使用thread我没调试成功,反正也不推荐这种方式,干脆不写了
2.threading 方式 也有两种做法
<1> 继承threading.Thread 重载run方法
#!/usr/bin/python
'''
Created on 2015-1-6
@author: huangpeng03
'''
import threading
class mythread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num
def run(self):
print 'I am ',self.num
if __name__ == '__main__':
t1 = mythread(1)
t2 = mythread(2)
t3 = mythread(3)
t1.start()
t2.start()
t3.start()
<2> 使用threading.Thread在线程中运行函数
#!/usr/bin/python
'''
Created on 2015-1-6
@author: huangpeng03
'''
import threading
def run(x,y):
for i in range(x,y):
print i
if __name__ == '__main__':
t1 = threading.Thread(target=run,args=(15,20))
t1.start()
3.join方法
如果一个线程或者函数在执行过程中调用另外一个线程,并且其完成后才能执行,这时就要用到.join()方法了
具体如下:
#!/usr/bin/python
'''
Created on 2015-1-6
@author: huangpeng03
'''
import threading
import time
class Mythread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
x = 0
print x
time.sleep(10)
print self.id
def func():
t.start()
t.join()
for i in range(5):
print i
if __name__ == '__main__':
t = Mythread(2)
func()
结果是:
0
2
0
1
2
3
4
4.isAlive方法用来判断线程是否正在运行
5.还有一些设置、更改线程名的方法
#!/usr/bin/python
'''
Created on 2015-1-6
@author: huangpeng03
'''
import threading
import time
class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name=threadname)
def run(self):
print self.getName()
if __name__ == '__main__':
t1 = mythread('t1')
print t1.getName()
t1.setName('T')
print t1.getName()
6.setDaemon 方法 在脚本运行过程中有一个主线程,如果主线程又创后再建了一个子线程,那么当主线程退出时,会检验子线程是否完成,如果子线程未完成,则主线程会等待子线程完成后再退出。当需要主线程退出时,不管子线程是否完成都随主线程退出,则看见恶意使用Thread对象的serDaemon方法来设置。
#!/usr/bin/python
'''
Created on 2015-1-6
@author: huangpeng03
'''
import threading
import time
class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name=threadname)
def run(self):
time.sleep(5)
print self.getName()
def func1():
t1.start()
print 'func1 done'
def func2():
t2.start()
print 'func2 done'
if __name__ == '__main__':
t1 = mythread('t1')
t2 = mythread('t2')
t2.setDaemon(True)
func1()
func2()