首先我们来解释一下多线程:多线程我们可以理解为多个进程/多个程序同时运行,多线程最大的好处就是帮助我们提高效率,平常我们1小时完成的任务,通过多线程10分钟就可以完成,甚至更短,这个就取决于你的线程数啦。
多线程会给我们带来什么:好处:它可以大大提高我们代码处理数据的速度;缺点:代码的复杂度也将随之提高,死锁问题也将随之产生。
我们该如果入手多线程:先尝试着成功运行一份多线程代码。然后再解读这份代码,依据自己现有的知识去理解这份代码,遇到不懂的地方记下来,然后带着这些疑问去看小编的教程你会发现事半功倍的。学完后记得自己写几个多线程加以训练。
需要Python3学习资源的小伙伴,可以关注左侧的微信公众号,有这些资源
这是小编为大家准备的一份多线程示范代码:
#!/usr/bin/python3
import queue
import threading
import time
exitFlag = 0
class myThread (threading.Thread):
def __init__(self, threadID, name, q):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.q = q
def run(self):
print ("开启线程:" + self.name)
process_data(self.name, self.q)
print ("退出线程:" + self.name)
def process_data(threadName, q):
while not exitFlag:
queueLock.acquire()
if not workQueue.empty():
data = q.get()
queueLock.release()
print ("%s processing %s" % (threadName, data))
else:
queueLock.release()
time.sleep(1)
threadList = ["Thread-1", "Thread-2", "Thread-3"]
nameList = ["One", "Two", "Three", "Four", "Five"]
queueLock = threading.Lock()
workQueue = queue.Queue(10)
threads = []
threadID = 1
# 创建新线程
for tName in threadList:
thread = myThread(threadID, tName, workQueue)
thread.start()
threads.append(thread)
threadID += 1
# 填充队列
queueLock.acquire()
for word in nameList:
workQueue.put(word)
queueLock.release()
# 等待队列清空
while not workQueue.empty():
pass
# 通知线程是时候退出
exitFlag = 1
# 等待所有线程完成
for t in threads:
t.join()
print ("退出主线程")
运行结果:
开启线程: Thread-1
开启线程: Thread-2
Thread-1: Wed Apr 6 11:52:57 2017
Thread-1: Wed Apr 6 11:52:58 2017
Thread-1: Wed Apr 6 11:52:59 2017
Thread-2: Wed Apr 6 11:53:01 2017
Thread-2: Wed Apr 6 11:53:03 2017
Thread-2: Wed Apr 6 11:53:05 2017
退出主线程
一、使用Threading模板块创建线程:
1,函数方法介绍:
2,要使用theading模板实现一个新线程,你要做的有:
定义Thread类的一个子类
重写__init__(self [,args])方法
然后,重写run(self [,args])方法
在你创建新的Thread子类以后,你可以创建它的一个实例,然后引用start()来开启一个新线程。
二、同步线程
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
引入“锁”的概念,锁的两种状态——锁定和未锁定
锁定:锁定部分代码不能被其他程序运行
未锁定:多个线程可以同时运行这部分
threadLock = threading.Lock()
#获取锁,对下面代码进行锁定,保持线程同步
threadLock.acquire()
#释放锁,解除上方代码的锁定,让其他进程进入
threadLock.release()
三、多线程优先级队列:
Queue模块允许你创建一个新的队列对象,以盛放一定数量的项目
控制Queue有以下方法: