python3 信号量和线程池 semaphore ThreadPollExector

信号量

  其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个

信号量模块 semaphore

使用起来和普通锁没 什么区别,但这个是比锁更加粗粒度锁,锁的是线程

在线程实例前加锁,把锁传递进线程,在线程结束时候释放锁

from threading import Thread, Semaphore
from queue import Queue


def add(chan, sem_lock):
    for i in range(10):
        chan.put(i)
    # 释放锁
    sem_lock.release()


if __name__ == '__main__':
    numbers = Queue()
    # 申明信号量
    sem_lock = Semaphore(4)
    sem_lock.acquire()
    # 把锁传递进线程
    tasks = {Thread(target=add, args=(numbers, sem_lock), name="test %s" % i) for i in range(10)}
    for task in tasks:
        task.start()
    for task in tasks:
        task.join()
    print(numbers.get())

线程池

  不仅仅是数量控制,可以获取线程状态、任务状态、线程返回值等信息

  线程池模块  ThreadPollExecutor

线程池使用过程

  1. 实例化线程池

  2. 提交任务,会有个返回对象,submit是不会堵塞,立即返回

  3. 让主线程等待线程执行完成

  4. 关闭线程池

获取状态信息  线程对象

  1. 判断是否执行完        .done()

  2. 获取任务执行结果,堵塞    .result()

  3. 取消任务            .cancle()

对多个线程列表获取结果  线程对象

1. as_complated 获取已经执行完成的线程结果

def add(number, name):
    sum = 0
    for i in range(number):
        sum += i
    # 模拟个线程执行堵塞情况
    time.sleep(random())
    # 返回线程执行结果
    return sum


if __name__ == '__main__':
    thread_pool = ThreadPoolExecutor(max_workers=3)
    name = "test"
    tasks = {thread_pool.submit(add, randint(10, 20), name) for _ in range(20)}

    # map方法和as_completed最大区别在于map变化的只是参数线程是同一个线程,而as_completed可以执行不同的线程任务
    for data in thread_pool.map(add, {randint(10, 20) for _ in range(20)}):
        print(data)

2. map 直接返回线程执行结果,保持传递进去顺序

def add(number):
    sum = 0
    for i in range(number):
        sum += i
    # 模拟个线程执行堵塞情况
    time.sleep(random())
    # 返回线程执行结果
    return sum


if __name__ == '__main__':
    thread_pool = ThreadPoolExecutor(max_workers=3)
    tasks = {thread_pool.submit(add, randint(10, 20)) for _ in range(20)}

    # map方法和as_completed最大区别在于map变化的只是参数线程是同一个线程,而as_completed可以执行不同的线程任务
    for data in thread_pool.map(add, {randint(10, 20) for _ in range(20)}):
        print(data)

3. wait 等待所有线程执行完成

from concurrent.futures import ThreadPoolExecutor, as_completed, wait
from random import randint, random
import time


def add(number):
    sum = 0
    for i in range(number):
        sum += i
    # 模拟个线程执行堵塞情况
    time.sleep(random())
    # 返回线程执行结果
    return sum


if __name__ == '__main__':
    thread_pool = ThreadPoolExecutor(max_workers=3)
    tasks = {thread_pool.submit(add, randint(10, 20)) for _ in range(20)}
    # 主线程等待所有子线程执行完,不需要结果
    # wait(tasks)

经验:

  1. 线程池和信号量在某种程度如允许执行的线程数效果上是一样,但线程池可以获取线程执行结果得到线程执行状态

  2. 使用线程池需要首先实例化,然后提交线程,返回线程对象,然后在主线程中选择获取结果或者不需要结果,也可以选择堵塞等待线程执行完或不等待线程执行完

  3. 获取线程执行结果,可以参照Go语言中CSP通信模式,个人觉得这是个非常好的解决方案,这样的线程池接口提交远比CSP通信来的复杂

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值