线程02-并发串行-互斥锁-Semaphore-Event

并行和串行线程

  1. 并发线程:主线程创建线程1,立即返回;创建线程2,立即返回。两个子线程各自执行 run,几乎同时打印 start,然后 sleep 1,然后几乎同时打印 done;---于是完成并行操作。
python 复制代码
import threading,time

def run(n):
    print("task start: ",n)
    time.sleep(1)
    print("task done: ",n)

start_time=time.time()
t1=threading.Thread(target=run,args=("t1",))
t2=threading.Thread(target=run,args=("t2",))
#并发进行
t1.start()
t2.start()

time.sleep(2)
print("cost time:", time.time()-start_time)
  1. 串行线程:主线程调用 t1.run -> task start t1 -> sleep 1 -> task done t1,接着调用t2.run -> task start t2 -> sleep 1 -> task done t2----于是完成串行操作;
python 复制代码
import threading,time

def run(n):
    print("task start: ",n)
    time.sleep(1)
    print("task done: ",n)

start_time=time.time()
t1=threading.Thread(target=run,args=("t1",))
t2=threading.Thread(target=run,args=("t2",))
#调用run函数,串行进行
t1.run()
t2.run()

time.sleep(2)
print("cost time:", time.time()-start_time)

测试结果:

等待线程完成

  1. 50个线程等待完成。通过两个循环实现线程完成。如果没有join()方法,只能看到线程开始执行;
python 复制代码
import threading,time

def run(n):
    print("task start: ",n)
    time.sleep(1)
    print("task done: ",n)

start_time=time.time()  #线程开始时间
t_list=[]  #启动的线程空列表
for x in range(50):
    t=threading.Thread(target=run,args=("t-{}".format(x+1),))
    t.start()
    t_list.append(t) #将每一个启动的线程加入list

for y in t_list:
    y.join()  #循环等待每个线程完成

time.sleep(1)
print("===waiting threading finish===",threading.current_thread())#当前完成的是主线程
print("cost time:", time.time()-start_time)  #所有线程消耗时间

测试结果

线程锁-互斥锁--加了锁的多线程

  1. 线程执行过程中,先获取锁然后执行该线程,执行完成后才能释放锁---这样就完成了互斥锁(只是小范围区域顺序执行,锁之外的线程依然是并行执行)
  2. 和run的区别:
    • run都是串行,加锁的多线程锁住的部分串行,其他并行,
    • run没有创建子线程只有一个主线程,加锁的多线程他创建子线程;
python 复制代码
import threading,time

lock=threading.Lock()#锁的实例化
def run(n):
    print("task start: ", n)

    global num
    lock.acquire() #获取锁
    num += 1
    lock.release()#释放锁

    time.sleep(1)
    print("task done: ", n)

num=0
t_list=[]  #启动的线程空列表
for x in range(10):
    t=threading.Thread(target=run,args=("t-{}".format(x+1),))
    t.start()
    t_list.append(t) #将每一个启动的线程加入list

for y in t_list:
    y.join()  #循环等待每个线程完成

time.sleep(1)
print("===waiting threading finish===",threading.current_thread())#当前完成的是主线程
print("num is ",num)

测试结果

Semaphore

  1. Semaphore允许多个线程同时进入,但数量有限制。threading.Semaphore 是一个计数器信号量;
  2. Semaphore 控制的是同时进入的线程数量,不是让线程串行;
python 复制代码
import threading,time

semaphore =threading.BoundedSemaphore(3)  #最多允许 3 个线程同时进入临界区
def run(n):
    with semaphore:  #使用with避免忘记释放锁
    time.sleep(1)
    print("run the thread:{}".format(n))
    
t_list=[]
num=0
for x in range(10):  #启动10个线程
    t=threading.Thread(target=run,args=(x,))
    t.start()
    num +=1
    t_list.append(t)

for t in t_list:  #循环执行线程
    t.join()
    
print("end")
print(num)

测试结果:

Event

  1. 事件:threading.Event() 是一个简单的线程间通信机制,维护一个内部标志,set() 设为 True,clear() 设为 False,wait() 阻塞直到标志为 True,is_set() 检查标志;
python 复制代码
import threading,time

event=threading.Event() #实例化事件,两个事件
def light():
    count=0
    event.set()  #初始化为绿灯
    while True:
        if count>4 and count<=9: #红灯  count = 5~9:红灯,event 被 clear(),变成 False
            event.clear()
            print("\033[41;1mred light is on...\033[0m")
        elif count>9:  count = 10:进入 elif,event.set() 变绿灯,count 重置为 0
            event.set()  #变绿灯
            count=0
            print("\033[42;1mgreen light is on...\033[0m")
        else:  #count = 0~4:绿灯,event 为 True
            print("\033[42;1mgreen light is on...\033[0m")
        time.sleep(1)
        count += 1
        
#绿灯就跑,红灯就等
def car(name):
    while True:
        if event.is_set():  # 绿灯
            print("[%s] running..."%name)
            time.sleep(1)
        else:   #红灯
            print("[%s]sees red light,waiting..."%name)
            event.wait()  #等待标记位设置
            print("[%s] green light is on,start going..."%name)


light=threading.Thread(target=light,)
light.daemon = True  # 设为守护线程,主线程结束就退出
light.start()

car1=threading.Thread(target=car,args=("奔驰",))
car1.daemon = True
car1.start()
相关推荐
张小凡vip2 小时前
python--爬虫--经验积累的遇到的坑
开发语言·爬虫·python
毕业设计7033 小时前
(免费领源码) 基于微信小程序的预制菜商城的设计与实现25172-java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·python·mysql·微信小程序·pycharm·微信开发者工具·推荐算法
xifangge20253 小时前
AGENTS.md 怎么写?涵盖 Java、Python、Vue、Go 的 8 套开箱即用模板
java·vue.js·python
大草原的小灰灰3 小时前
Python基础语法
开发语言·python
小葱炖豆腐4 小时前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
Ticnix5 小时前
MCP 实战:把工具层从 Agent 里彻底解耦
python·mcp
XZ-0700016 小时前
week4-1-figure画布
python
步行cgn7 小时前
Spring 注入 Map 集合详解
数据库·python·spring
今儿敲了吗7 小时前
03停用词过滤
笔记·python