关于信号量的思考

java中提供的信号量实现Semaphore类

  1. 初始化10个信号量
  Semaphore sem = new Semaphore(10);
  1. 获取信号量
	sem.acquire(2);
  1. 入门级案例
 private static final Integer SEM_MAX = 1;
    public static void main(String[] args) {
        Semaphore sem = new Semaphore(SEM_MAX);
        ExecutorService threadPool = Executors.newFixedThreadPool(5);
        //在线程池中执行任务
        threadPool.execute(new MyThread(sem, 1));
        threadPool.execute(new MyThread(sem, 1));
//        threadPool.execute(new MyThread(sem, 7));
        //关闭池
        threadPool.shutdown();
    }

}
    class MyThread extends Thread {
        private volatile Semaphore sem;    // 信号量
         private int count;        // 申请信号量的大小
        MyThread(Semaphore sem, int count) {
            this.sem = sem;
            this.count = count;
        }
        public void run() {
            try {
                // 从信号量中获取count个许可
                sem.acquire(count);
                System.out.println(Thread.currentThread().getName() + " start dosomething");
                Thread.sleep(2000);
                System.out.println(Thread.currentThread().getName() + " end dosomething");
                //System.out.println(" availble="+sem.availablePermits());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                // 释放给定数目的许可,将其返回到信号量。
                sem.release(count);
                System.out.println(Thread.currentThread().getName() + " release " + count + "");
            }
        }}

其中初始化信号量的值为1,则相当于锁的作用,每次只允许一个线程进入。
通过有上限的 Semaphore 可以限制进入某代码块的线程数量;

C语言中信号量的实现

  1. sem_id=semget(key,1,IPC_CREAT|0600);//创建信号量集
  2. semctl(sem_id,nsem_id,SETVAL,val) //初始化信号量
  3. semop(sem_id,&sbuf,1)//申请信号量
  4. semop(sem_id,&sbuf,1)//释放信号量
    具体demo还在学习中

spring Zuul RateLimiter 限流
zuul网关限流——使用ZuulFilter和RateLimiter可以实现令牌桶限流,与信号量的思想差不多

 //每秒产生1000个令牌,类似于Semaphore信号量中new Semaphore(1000);
private static final RateLimiter RATE_LIMITER = RateLimiter.create(1000);

@Override
    public Object run() throws ZuulException {
        //就相当于每调用一次tryAcquire()方法,令牌数量减1,当1000个用完后,那么后面进来的用户无法访问上面接
        //当然这里只写类上面一个接口,可以这么写,实际可以在这里要加一层接口判断。
        if (!RATE_LIMITER.tryAcquire()) {//类似于Semaphore信号量中acquire()方法
            requestContext.setSendZuulResponse(false); 
        }
        return null;
    }
### 如何加载使用PyTorch Model PTH 文件 #### 加载PTH文件中的模型参数至ResNet18 对于.pth文件仅存储模型权重的情况,可以通过`torch.load()`函数读取这些权重,并利用`.load_state_dict()`方法将其应用到已定义好的相同架构的神经网络上。例如,在处理ResNet18时: ```python import torch from torchvision.models import resnet18 # 创建一个带有预训练权重的ResNet18实例 resnet18_model = resnet18(pretrained=True) # 定义.pth文件路径并加载其中的数据 pth_file_path = 'D:/python_code/resnet18/resnet18-5c106cde.pth' loaded_weights = torch.load(pth_file_path) # 将加载的权重应用于ResNet18模型 resnet18_model.load_state_dict(loaded_weights) print(resnet18_model)[^1] ``` 此过程确保了可以从外部源获取预先训练过的模型权重,并轻松地集成到现有的项目环境中。 #### 处理包含更多元信息的PTH.TAR文件 当面对像.pth.tar这样的打包文件时,通常不仅限于简单的状态字典,还可能包含了优化器的状态以及其他辅助变量等额外的信息。为了正确解析这类更复杂的存档,建议指定映射位置(如CPU或GPU),以便更好地控制资源分配: ```python import torch archive_path = 'iNat_2018_InceptionV3.pth.tar' checkpoint = torch.load(archive_path, map_location='cpu') # 假设档案内有一个键名为'model'用于表示模型状态字典 model.load_state_dict(checkpoint['model']) ``` 这种方法允许更加灵活地恢复完整的训练环境而不仅仅是模型本身[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值