首先我们来解释一下多线程:多线程我们可以理解为多个进程/多个程序同时运行,多线程最大的好处就是帮助我们提高效率,平常我们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,函数方法介绍:
- run():用以表示线程活动的方法
- start():启动线程活动
- join([time]):等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
- isAlive():检查一个线程是否仍旧在进行
- getName():返回一个线程的名字
- setName():设置一个线程的名字
2,要使用theading模板实现一个新线程,你要做的有:
定义Thread类的一个子类
重写__init__(self [,args])方法
然后,重写run(self [,args])方法
在你创建新的Thread子类以后,你可以创建它的一个实例,然后引用start()来开启一个新线程。
二、同步线程
如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。
引入“锁”的概念,锁的两种状态——锁定和未锁定
锁定:锁定部分代码不能被其他程序运行
未锁定:多个线程可以同时运行这部分
threadLock = threading.Lock() #获取锁,对下面代码进行锁定,保持线程同步 threadLock.acquire() #释放锁,解除上方代码的锁定,让其他进程进入 threadLock.release()
三、多线程优先级队列:
Queue模块允许你创建一个新的队列对象,以盛放一定数量的项目
控制Queue有以下方法:
- get():从队列移除一个项目并返回它
- put():把项目放入队列
- qsize():返回当前队列中项目的数量
- empty():如果队列为空,返回True,反之为False
- full():如果队列满了返回True,反之为False