开启线程
'''一个进程最少有一个主线程, 一个进程中可以开启多个线程'''
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()