来自Python的问候
下面开启我们今天美好的课程,我们学习的是线程:
- 多线程就像同时执行多个不同程序
- Python3 线程中常用的两个模块为:
_thread
threading - 使用线程有两种方式:函数或者用类来包装线程对象。
- 使用函数:
调用 _thread 模块中的start_new_thread()函数来产生新线程。
import _thread #多线程
import win32api
def show(i):
mystr = win32api.MessageBox(0,"你真帅","我来啦",0)
for i in range(5):
_thread.start_new_thread(show,(i,))
while True:
pass
1. 多线程抢占cpu
import _thread
import time
def go():
for i in range(5):
print(i,"-------")
time.sleep(1)
for i in range(5): # 同时执行5次
_thread.start_new_thread(go,())
for j in range(6): # 让主线程卡顿6秒
time.sleep(1)
print("over")
2. 基于类实现多线程
- 使用 threading 模块创建线程
我们可以通过直接从 threading.Thread 继承创建一个新的子类,并实例化后调用 start() 方法启动新线程,即调用了线程的 run() 方法。
import threading
class Tom(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.NUM = 0
def run(self):
for _ in range(1000):
self.NUM += 1
print(self.NUM)
if __name__ == "__main__":
ts = []
for i in range(5):
t =Tom()
t.start()
ts.append(t)
for t in ts:
t.join()
print('Over')
3. 线程冲突
import _thread
num = 0
def add():
for _ in range(1000000):
global num
num += 1
print(num)
for i in range(5):
_thread.start_new_thread(add,())
while True: # 防止主线程不死
pass
这里就是线程冲突,5个线程同时抢夺num的资源,导致最后结果错误。
4. 线程同步
锁有两种状态——锁定和未锁定。每当一个线程比如"set"要访问共享数据时,必须先获得锁定;如果已经有别的线程比如"print"获得锁定了,那么就让线程"set"暂停,也就是同步阻塞;等到线程"print"访问完毕,释放锁以后,再让线程"set"继续。
import threading
num = 0
mutex = threading.Lock() # 创建一个锁,threading.Lock()是一个类
class Myhtread(threading.Thread):
def run(self):
global num
if mutex.acquire(1): # 如果锁成功,那么线程继续干活,如果锁失败,下面的线程一直等待锁成功,1,代表独占
for i in range(1000): # 数字小的时候还是不会产生线程冲突的
num += 1
mutex.release() # 写完一定要解锁
print(num)
mythread = []
for i in range(3):
t = Myhtread()
t.start()
mythread.append(t)
for thread in mythread:
thread.join()
print("over")