线程

开启线程

'''一个进程最少有一个主线程, 一个进程中可以开启多个线程'''

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()
posted @ 2021-07-31 13:09  wuc123  阅读(43)  评论(0)    收藏  举报