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
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]