Python threading多线程编程实例
Python 的多线程有两种实现方法: 函数,线程类 1.函数 调用 thread 模块中的 start_new_thread() 函数来创建线程,以线程函数的形式告诉线程该做什么 复制代码 代码如下: # -*- coding: utf-8 -*- import thread def f(name): #定义线程函数 print "this is " + name if __name__ == '__main__': thread.start_new_thread(f,("thread1",)) #用start_new_thread()调用线程函数和其他参数 while 1: pass 不过这种方法暂时没能找到其他辅助方法,连主线程等待都要用 while 1 这种方法解决。 2.线程类 调用 threading 模块,创建 threading.Thread 的子类来得到自定义线程类。 复制代码 代码如下: # -*- coding: utf-8 -*- import threading class Th(threading.Thread): def __init__(self,name): threading.Thread.__init__(self) self.t_name = name #调用父类构造函数 def run(self): #重写run()函数,线程默认从此函数开始执行 print "This is " + self.t_name if __name__ == '__main__': thread1 = Th("Thread_1") thread1.start() #start()函数启动线程,自动执行run()函数 threading.Thread 类的可继承函数: 实例 复制代码 代码如下: import threading import time class Th(threading.Thread): def __init__(self,thread_name): threading.Thread.__init__(self) self.setName(thread_name) def run(self): print "This is thread " + self.getName() for i in range(5): time.sleep(1) print str(i) print self.getName() + "is over" join() 阻塞等待 复制代码 代码如下: if __name__ == '__main__': thread1 = Th("T1 ") thread1.start() #thread1.join() print "main thread is over" 不带 thread1.join() ,得到如下结果: 复制代码 代码如下: This is thread T1 main thread is over 0 1 2 T1 is over 不等待 thread1 完成,执行之后语句。 加了 thread1.join() ,得到如下结果: 复制代码 代码如下: This is thread T1 0 1 2 T1 is over main thread is over 阻塞等待 thread1 结束,才执行下面语句 主线程等待 复制代码 代码如下: if __name__ == '__main__': thread1 = Th("T1 ") thread1.setDaemon(True) #要在线程执行之前就设置这个量 thread1.start() print "main thread is over" 报错: Exception in thread T1 (most likely raised during interpreter shutdown): 多个子线程 复制代码 代码如下: if __name__ == '__main__': for i in range(3): t = Th(str(i)) t.start() print "main thread is over" 这里的 t 可同时处理多个线程,即 t 为线程句柄,重新赋值不影响线程。 这里奇怪的是,运行 t.run() 时,不会再执行其他线程。虽不明,还是用 start() 吧。暂且理解为 start() 是非阻塞并行的,而 run 是阻塞的。 线程锁 threading 提供线程锁,可以实现线程同步。 复制代码 代码如下: import threading import time class Th(threading.Thread): def __init__(self,thread_name): threading.Thread.__init__(self) self.setName(thread_name) def run(self): threadLock.acquire() #获得锁之后再运行 print "This is thread " + self.getName() for i in range(3): time.sleep(1) print str(i) print self.getName() + " is over" threadLock.release() #释放锁 if __name__ == '__main__': threadLock = threading.Lock() #设置全局锁 thread1 = Th('Thread_1') thread2 = Th('Thread_2') thread1.start() thread2.start() 得到结果: 复制代码 代码如下: This is thread Thread_1 0 1 2 Thread_1 is over This is thread Thread_2 0 1 2 Thread_2 is over (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |