Pythonthreading多线程编程实例
Python的多线程有两种实现方法:
函数,线程类
1.函数
调用thread模块中的start_new_thread()函数来创建线程,以线程函数的形式告诉线程该做什么
#-*-coding:utf-8-*-
importthread
deff(name):
#定义线程函数
print"thisis"+name
if__name__=="__main__":
thread.start_new_thread(f,("thread1",))
#用start_new_thread()调用线程函数和其他参数
while1:
pass
不过这种方法暂时没能找到其他辅助方法,连主线程等待都要用while1这种方法解决。
2.线程类
调用threading模块,创建threading.Thread的子类来得到自定义线程类。
#-*-coding:utf-8-*-
importthreading
classTh(threading.Thread):
def__init__(self,name):
threading.Thread.__init__(self)
self.t_name=name
#调用父类构造函数
defrun(self):
#重写run()函数,线程默认从此函数开始执行
print"Thisis"+self.t_name
if__name__=="__main__":
thread1=Th("Thread_1")
thread1.start()
#start()函数启动线程,自动执行run()函数
threading.Thread类的可继承函数:
getName()获得线程对象名称
setName()设置线程对象名称
join()等待调用的线程结束后再运行之后的命令
setDaemon(bool)阻塞模式,True:父线程不等待子线程结束,False等待,默认为False
isDaemon()判断子线程是否和父线程一起结束,即setDaemon()设置的值
isAlive()判断线程是否在运行
实例
join()阻塞等待 不带thread1.join(),得到如下结果: 主线程等待 报错:ExceptioninthreadT1(mostlikelyraisedduringinterpretershutdown): 多个子线程 这里的t可同时处理多个线程,即t为线程句柄,重新赋值不影响线程。 这里奇怪的是,运行t.run()时,不会再执行其他线程。虽不明,还是用start()吧。暂且理解为start()是非阻塞并行的,而run是阻塞的。 线程锁 threading提供线程锁,可以实现线程同步。 得到结果:
importthreading
importtime
classTh(threading.Thread):
def__init__(self,thread_name):
threading.Thread.__init__(self)
self.setName(thread_name)
defrun(self):
print"Thisisthread"+self.getName()
foriinrange(5):
time.sleep(1)
printstr(i)
printself.getName()+"isover"
if__name__=="__main__":
thread1=Th("T1")
thread1.start()
#thread1.join()
print"mainthreadisover"
ThisisthreadT1
mainthreadisover
0
1
2
T1isover
不等待thread1完成,执行之后语句。
加了thread1.join(),得到如下结果:
ThisisthreadT1
0
1
2
T1isover
mainthreadisover
阻塞等待thread1结束,才执行下面语句
if__name__=="__main__":
thread1=Th("T1")
thread1.setDaemon(True)
#要在线程执行之前就设置这个量
thread1.start()
print"mainthreadisover"
也就是主线程不等待子线程就结束了。
if__name__=="__main__":
foriinrange(3):
t=Th(str(i))
t.start()
print"mainthreadisover"
importthreading
importtime
classTh(threading.Thread):
def__init__(self,thread_name):
threading.Thread.__init__(self)
self.setName(thread_name)
defrun(self):
threadLock.acquire()
#获得锁之后再运行
print"Thisisthread"+self.getName()
foriinrange(3):
time.sleep(1)
printstr(i)
printself.getName()+"isover"
threadLock.release()
#释放锁
if__name__=="__main__":
threadLock=threading.Lock()
#设置全局锁
thread1=Th("Thread_1")
thread2=Th("Thread_2")
thread1.start()
thread2.start()
ThisisthreadThread_1
0
1
2
Thread_1isover
ThisisthreadThread_2
0
1
2
Thread_2isover
相关文章