视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Pythonthreading多线程编程实例
2020-11-27 14:30:59 责编:小采
文档


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 类的可继承函数:
getName() 获得线程对象名称
setName() 设置线程对象名称
join() 等待调用的线程结束后再运行之后的命令
setDaemon(bool) 阻塞模式, True: 父线程不等待子线程结束, False 等待,默认为 False
isDaemon() 判断子线程是否和父线程一起结束,即 setDaemon() 设置的值
isAlive() 判断线程是否在运行

实例

代码如下:


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

下载本文
显示全文
专题