一种超时控制的方式

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿

今天看到 这篇文章:您还有心跳吗?超时机制分析   觉得挺有意思,有兴趣的同学可以先看看他的文章,简单记录了下自己的一个想法,无论好坏,权当参与讨论,共同进步吧。

其实 lz 一直限制在了取系统时间耗时的问题上,所以,一直想变相的通过各种手法排除掉获取系统时间的逻辑,比如使用“次数”来对连接实现超时控制,但其实,使用次数来表示超时控制本身就是个伪命题, 比如,在超时次数的阀值是100,如果在90次后,就一直没有被其他线程使用,一直不到阀值,那怎么去将这个连接释放掉呢?

所以,我想到了另外一种方式解决这个问题:

首先,要明确,我认为取系统时间可以取的,但是不一定要获取连接的这个线程去做这个事情,比如交给其他线程去做,模型可能是这样:

     1. 线程A 拿到连接,调用refresh方法

     2.refresh方法中,将连接自己放到一个队列中,后返回。

     3. 某个特殊线程S不停的去队列中拿元素,并且,将拿到的元素和拿到时刻的时间记录下,封装好交给hash环 H, H是一个类似HashMap的HASH环,只不过头尾相接。

     4. Timer线程T不停的去遍历H,将超时时间大于某个阀值的连接拿掉,设置为超时连接。

不过这里需要注意到几个问题:

     1. 考虑到Connection不会无限制增多,设计成环,环并不会无限制增大,所以,可行。

     2. 更仔细点,可以将Connection中放一个标志位,标示是否正在使用,timer扫描时,超时间在使用状态,或者超时间不使用的连接(标准可能不同,在被使用的,可能时间要长一点。)都可以判定为超时连接

     3. 因为连接数有限,所以,线程S的队列中,也不会太长(每个连接一个位子)。

     4. 通过线程S的接入,将去系统时间等耗时操作从连接转移到了线程S中,提高S线程的处理速度。

     5. 线程S或许还可以一次从队列中取出多个元素,统一取一次系统时间,将取出来的多个元素设置为该时间,整个操作在毫秒内完成,可以用一个时间约等于各自连接时的真正时间,降低系统时间的获取频率。

     6……. 欢迎补充。

以一个线程S的代价,加快了各个连接所在线程的处理速率,值。

版权声明:本文为本作者原创文章,转载请注明出处。感谢 码梦为生| 刘锟洋 的投稿

文章转自 并发编程网-ifeve.com

时间: 2024-11-01 22:47:07

一种超时控制的方式的相关文章

UIButton的两种block传值方式

UIButton的两种block传值方式 方式1 - 作为属性来传值 BlockView.h 与 BlockView.m // // BlockView.h // Block // // Created by YouXianMing on 15/1/14. // Copyright (c) 2015年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @class BlockView; /** 定义枚举值 */ typed

熟知蜘蛛两种爬取方式来调整网站布局

近段时间百度对反垃圾页面的执行力度在日趋增强这让很多站点排名都受到大幅波动,当然笔者小站也不例外,但小鱼始终明白一点搜索引擎不断调整算法的本身是为了符合用户体验这也说明一点只要我们站在用户的角度去运营自己的小站那么网站的排名就自然不会差.今天笔者针对站内收录这块给大家分享下熟知蜘蛛爬取的两种方式来改变网站结构的布局. 网站收录对于很多朋友来说一直是一个追问的话题,除了我们通常所说的sitemap制作外还有一点不可小却那就是网站的层次布局,为什么这样说呢?下面笔者就蜘蛛的两种爬取方式来为你一一说道

WCF技术剖析之二十九:换种不同的方式调用WCF服务

我们有两种典型的WCF调用方式:通过SvcUtil.exe(或者添加Web引用)导入发布的服务元数据生成服务代理相关的代码和配置:通过ChannelFactory<TChannel>创建服务代理对象.在这篇文章中,我们采用一种独特的方式进行服务的调用.从本质上讲,我们只要能够创建于服务端相匹配的终结点,就能够实现正常的服务调用.在WCF客户端元数据架构体系中,利用MetadataExchangeClient可以获取服务的元数据,而利用MetadataImporter将获取的元数据导入成Serv

JavaScript的9种继承实现方式归纳

  这篇文章主要介绍了JavaScript的9种继承实现方式归纳,本文讲解了原型链继承.原型继承(非原型链).临时构造器继承.属性拷贝.对象间继承等继承方式,需要的朋友可以参考下 不同于基于类的编程语言,如 C++ 和 Java,JavaScript 中的继承方式是基于原型的.同时由于 JavaScript 是一门非常灵活的语言,其实现继承的方式也非常多. 首要的基本概念是关于构造函数和原型链的,父对象的构造函数称为Parent,子对象的构造函数称为Child,对应的父对象和子对象分别为pare

Spring两种依赖注入方式的比较

       我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入.先看代码: 假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法,还有一个包含这三个属性的构造方法.如果用spring来管理这个对象,那么有以下两种方式为People设置属性: 1.设值注入: ? 1 2 3 4 5 6 <bean id="people" class="com.abc.People"&g

LVS:三种负载均衡方式比较+另三种负载均衡方式

什么是LVS?   首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的.高可用的虚拟服务器.整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序.   为此,在设计时需要考虑系统的透明性.可伸缩性.高可用性和易管理性.一般来说,LVS集群

Python安全运维实战:针对几种特定隐藏方式的Webshell查杀

Webshell一直都是网站管理员痛恨看到的东西,一旦在网站目录里看到了陌生的webshell基本说明网站已经被攻击者拿下了.站在攻击者的角度,要想渗透一台网站服务器,第一个目标也是想方设法的寻找漏洞上传webshell. 对于webshell的防护通常基于两点:一是在攻击者上传和访问时通过特征匹配进行检测拦截或限制文件类型阻止上传;二就是日常基于webshell文件特征的静态查杀(也有基于日志的,在这里不做讨论).第一种方法不是我们今天要讨论的,waf.安全狗等一系列工具可以实现相应的功能.第

VMware运行Ubuntu 三种网络连接方式:bridge、NAT、Host-Only的区别详解

概述: VMWare提供了三种工作模式,它们是bridged(桥接模式).NAT(网络地址转换模式)和host-only(主机模式).要想在网络管理和维护中合理应用它们,你就应该先了解一下这三种工作模式. 1.bridged(桥接模式) 在这种模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访问网内任何一台机器. 在桥接模式下,你需要手工为虚拟系统配置IP地址.子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主机器进行通信.同时,由于这个虚拟系统是局域网

ASP.NET MVC下的四种验证编程方式[续篇]

原文:ASP.NET MVC下的四种验证编程方式[续篇] 在<ASP.NET MVC下的四种验证编程方式>一文中我们介绍了ASP.NET MVC支持的四种服务端验证的编程方式("手工验证"."标注ValidationAttribute特性"."让数据类型实现IValidatableObject或者IDataErrorInfo"),那么在ASP.NET MVC框架内部是如何提供针对这四种不同编程方式的支持的呢?接下来我们就来聊聊这背后的