zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Pythonthreading多线程编程实例

2023-06-13 09:15:46 时间

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()判断线程是否在运行

实例

复制代码代码如下:
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"

join()阻塞等待

复制代码代码如下:
if__name__=="__main__":
   thread1=Th("T1")
   thread1.start()
   #thread1.join()
   print"mainthreadisover"

不带thread1.join(),得到如下结果:

复制代码代码如下:
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"

报错:ExceptioninthreadT1(mostlikelyraisedduringinterpretershutdown):
也就是主线程不等待子线程就结束了。

多个子线程

复制代码代码如下:
if__name__=="__main__":
   foriinrange(3):
       t=Th(str(i))
       t.start()
   print"mainthreadisover"

这里的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):
   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