开启线程
'''一个进程最少有一个主线程, 一个进程中可以开启多个线程'''
from threading import Thread
def task():
print('线程')
if __name__ == '__main__':
t = Thread(target=task)
t.start()
print('主线程')
GIL锁
1.在任意时刻只有一个线程在解释器中运行
2.GIL锁它是在python解释器中的, 只在cpython中有, pypy解释器是没有GIL锁的
3.起一个垃圾回收线程, 一个是正常执行的线程
4.设置了一把锁(GIL锁), 一个线程要想执行,必须拿到这把锁
5.如果是计算密集型:要开进程
6.如果是io密集型:要开线程
Thread类的方法
# print(t.is_alive())
# print(t.getName())
# t.setName('ly_1')
# print(t.getName())
# res = threading.currentThread()
# print(res)
t.join()
# res = threading.enumerate() # 列表
# print(res)
# res = threading.activeCount()
# print(res)
守护线程
def task():
time.sleep(1)
print("我是子线程")
if __name__ == '__main__':
t = Thread(target=task,)
t.setDaemon(True) # 开启守护线程, 主线程结束,子线程跟着结束
t.start()
print("主线程")
互斥锁(同步锁)
from threading import Thread, Lock
def task(lock):
# 上锁
lock.acquire()
global n
temp = n
# 并发安全
# 10个线程都卡在这了
time.sleep(1)
# n -= 1 # n=n-1
n = temp-1
# 释放锁
lock.release()
if __name__ == '__main__':
n = 10
ll = []
lock = Lock()
for i in range(10):
t = Thread(target=task, args=(lock, ))
t.start()
ll.append(t)
for j in ll:
j.join()
print("主线程:", n)
信号量
from threading import Thread,Semaphore
import time
def task(i, sm):
# 上锁
sm.acquire()
print("%s:这个人开始上厕所了" % i)
time.sleep(3)
print("%s:这个人上完了" % i)
# 释放锁
sm.release()
# Semaphore:信号量可以理解为多把锁,同时允许多个线程来更改数据
if __name__ == '__main__':
sm = Semaphore(2) #
for i in range(10):
t = Thread(target=task, args=(i, sm))
t.start()
Event事件
from threading import Thread, Event
import time
def girl(event):
print("都女士正在恋爱中...")
time.sleep(3)
print("都女生分手了")
# 发出分手的信号
event.set()
def boy(i, event):
print("渣男:%s正在等待都女生分手" % i)
# 卡住
event.wait()
print("渣男:%s开始追了" % i)
if __name__ == '__main__':
event = Event()
t = Thread(target=girl, args=(event,))
t.start()
for i in range(10):
b_t = Thread(target=boy, args=(i, event))
b_t.start()