timeout机制实现研究

基于Java的高校校园点餐系统 本文介绍了一个基于Java技术开发的高校校园点餐系统,该系统以B/S结构为基础,采用MySQL作为数据库,实现了一个高效、便捷的在线点餐平台。系统主要面向三类用户:管理员、用户和食堂工作人员,提供包括用户管理、食堂管理、菜单管理、订单管理等在内的多项功能。通过系统的具体测试,验证了其可行性和有效性,为高校师生提供了一个科学化、系统化的点餐服务。高校校园点餐系统的开发和实现,不仅提高了校园餐饮服务的效率和质量,也为师生提供了一个更加便捷的点餐体验。 阅读详情

    在很多的实际的服务器程序中,针对业务的处理具有超时返回(return if time out)的要求,也就是说不能无限制的处理每一个业务,不能因为一个业务的长时间没有运行完毕就让服务器程序阻塞在处理该业务逻辑的位置而不能继续运行后面的任务,这时,设立timeout机制就成为必须的了,简单地说,就是一旦当业务的处理时间超过了timeout设置的值比如说10秒,那么该业务不再执行而就提前返回,相反,若该业务的处理时间没有超过timeout设置的值,那么该业务执行完毕正常返回,设置timeout的值使得服务器程序在处理该业务的时间长度不长于某个设定值 。

         说起来轻松,做起来难呐,到底该怎么样用代码去实现这么一个机制呢?本人研究一阵子,在经过肯定-否定-否定之否定的几个螺旋循环之后,终于修得正果,后来据我一同行哥们说华为的时间锁也是采用我的这个思想,嘿嘿!特发表出来,繁荣网络资源下,下面从两个方面来阐述我的思想:

        1,思路:设置一个全局标志量并初始化,这个用来标识具体某个业务是否执行完毕,具体做法是该业务开始执行时修改其值,执行完毕退出前改回原来的值,在程序其他位置就可以观察该全局变量的值是否发生变化来判断该业务逻辑是否执行完毕。另外,必须采用多线程并发执行模式,总不可能等业务逻辑执行完了之后或者开始执行之前开始计时吧,那就太SB了,所以从逻辑上讲,执行业务逻辑和计时应该是同时进行的,就好像跑步比赛,你跑步和教练员计时是同时进行的,要是等教练计时完了你再跑或者等你跑完了教练再开始计时,那就成了国人茶钱饭后的笑料谈资了啊!

        2,工欲善其事,必先利其器,得复习一个关键的工具:pthread_cancel这是个好东东诶,可以在一个线程里强奸式结束另外一个线程。

 

以下是代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
 
//基本上研究清楚了
void *print_message_function( void *ptr );
void *print_message( void *ptr );
void *print(void *ptr);
int i=0; 

int flag=0;//使用该数的状态切换来表示线程切换
pthread_t thread1;
pthread_t thread3;

main()
{
    
     char *message1 = "Thread 1";     
     int  iret1;
     iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); 
     pthread_join( thread1, NULL); 
      printf("整个程序退出!/n")   ; 
     exit(0);
}
 
void *print_message_function( void *ptr )
{
 time_t cur1,cur2;
 cur1=time(NULL);
 char *message;
 message = (char *) ptr;
 printf("%s /n", message);
 int iret3;
 flag=11;
 iret3=pthread_create( &thread3, NULL, print, "my name is 007");
 sleep(10);//模拟具体的业务逻辑,假设需要执行10秒钟
 flag=0;
 cur2=time(NULL);
 printf("函数print_message_function执行时间是%ld秒 /n",cur2-cur1); 
 pthread_join(thread3,NULL);  
}
 void *print(void *ptr)
{
 printf("flag=%d ,退出!%s/n",flag,(char *)ptr);
 sleep(2);//这里的2就是timeout设定值
 if(flag)
 pthread_cancel(thread1);
}

 

输出为:

 [root@localhost PosixThread]# mytimer
Thread 1
flag=11 ,退出!my name is 007
整个程序退出!

 

说明线程1提前退出了,原因在于其执行时间为10秒钟超过了在线程3钟设定的timeout值2秒钟,实际上,程序正是只执行了两秒钟多就退出了(两秒是处理业务逻辑时间,多是其他程序执行时间)

 修改程序参数成为如下的情形:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <time.h>
 
//基本上研究清楚了
void *print_message_function( void *ptr );
void *print_message( void *ptr );
void *print(void *ptr);
int i=0; 

int flag=0;//使用该数的状态切换来表示线程切换
pthread_t thread1;
pthread_t thread3;

main()
{
    
     char *message1 = "Thread 1";     
     int  iret1;
     iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1); 
     pthread_join( thread1, NULL); 
      printf("整个程序退出!/n")   ; 
     exit(0);
}
 
void *print_message_function( void *ptr )
{
 time_t cur1,cur2;
 cur1=time(NULL);
 char *message;
 message = (char *) ptr;
 printf("%s /n", message);
 int iret3;
 flag=11;
 iret3=pthread_create( &thread3, NULL, print, "my name is 007");
 sleep(2);//模拟具体的业务逻辑,假设需要执行10秒钟
 flag=0;
 cur2=time(NULL);
 printf("函数print_message_function执行时间是%ld秒 /n",cur2-cur1); 
 pthread_join(thread3,NULL);  
}
 void *print(void *ptr)
{
 printf("flag=%d ,退出!%s/n",flag,(char *)ptr);
 sleep(10);//这里的2就是timeout设定值
 if(flag)
 pthread_cancel(thread1);
}

 

[root@localhost PosixThread]# mytimer
Thread 1
flag=11 ,退出!my name is 007
函数print_message_function执行时间是2秒
整个程序退出!

 

可见设置的timeout为10秒钟竟然比处理业务逻辑的时间好要长,业务逻辑不干了,只需要等自己执行完毕(时长2秒钟)就退出了

 

 

以上程序只是简单的模拟了定时器思想,但是毫无疑问,它实现了定时器的两反面逻辑(超时该怎么办吗,没有超时该怎么办),我们可以进一步将它进行封装,并提供对外设置timeout值,业务逻辑入口等对外接口,就可以成为自己的定时器,以后调用起来就很方便了。

       

 

 

 

 

 

            

 

 

进程间通信的七种方法实战演示!值得收藏! 线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射 阅读详情

相关推荐

非凸问题的求解方法以及连续凸逼近SCA(Successive Convex Approximation)方法

非凸问题的求解方法 针对形如下式的函数: min⁡x∈XV(x)=F(x)+G(x)\min\limits_{{\bf{x}}\in X} V(x)=F(x)+G(x)x∈Xmin​V(x)=F(x)+G(x); 其中F为光滑的(不一定convex),G是convex的但是可能不可微,且存在:对于n维实矢量空间,有X=X1×...×XNX=X_1 \times...\times X_NX=X1​×...×XN​; x=(x1,...,xN)\bf{x} =(x_1,...,x_N)x=(x1​,...,xN

weixin_44535200的博客 2万+

C语言实现简单的定时器,使用select函数

请注意,这段代码使用了select函数来实现定时器功能。select函数用于等待文件描述符准备好进行I/O操作,这里将timeout结构体传递给select函数,使得程序在指定的时间间隔内阻塞,直到定时器触发。这段代码是一个C语言程序,它实现了一个简单的定时器功能。当调用timer函数时,它会创建一个定时器,每隔指定的秒数(seconds参数)触发一次,并打印出"定时器触发"的提示信息。在main函数中,timer函数被调用并传入了5作为参数,表示每隔5秒触发一次定时器。程序会一直运行,直到手动停止。

qq_40843427的博客 1223

基于Stigmergy的团队LLM wiki协作机制与FastAPI工程实践

大语言模型驱动的知识管理正在改变个人笔记与团队文档的维护方式,但当多人共同维护一个维基时,如何避免版本覆盖、上下文丢失和幻觉污染成为核心挑战。Stigmergy这一源自生物学的协作机制提供了新思路:通过共享环境中的痕迹(如评论、标记、修订历史)实现异步协作,无需实时沟通或中心协调者。本文将原理落地为可工程化的系统,设计Page、Revision、Trace三大实体,并结合向量索引与LLM审查流程,最终用FastAPI与SQLite搭建一个最小可运行原型。从白蚁筑巢到团队知识库,Stigmergy让每个参与者

weixin_34174322的博客 364

Linux C/C++ timeout命令实现(运行具有时间限制)

Linux附带了大量命令,每个命令都是唯一的,并在特定情况下使用。Linux timeout命令的一个属性是时间限制。可以为任何命令设置时间限制。如果时间到期,命令将停止执行。

chen1415886044的博客 4495

自适应滤波算法综述

自适应滤波算法综述

xdzhujy的博客 5万+

ESP32 BLE Mesh Provisioner实战:手把手教你用ESP-IDF配网智能灯泡(附常见错误排查)

本文提供了一份基于ESP-IDF的ESP32 BLE Mesh Provisioner实战指南,详细解析了配网器的核心角色与工作流程。文章手把手教你从工程搭建、代码初始化到核心回调解析,并重点针对常见的‘Model not bound to AppKey’等错误提供了深度排查思路与解决方案,帮助你构建一个稳定可靠的智能照明网关。

desk3的博客 514

你知道这些关于网络请求读写超时的细节吗

公司有一个项目有下载app的模块,这样的话下载操作就比较常用,平时我们的应用只有检查更新时才用到下载,所以app下载的操作多了就会想到优化一下,就写了一个多线程下载,我没有使用第三方封装好的一些下载库,正因为没有使用第三方下载库,所以才能多学到一点东西。 使用的网络请求是主流的OkHttp,通过阅读源码,可以知道OkHttp默认的超时时间是10秒,分3种情况,如下(OkHttpClient.Builder的构造函数): public Builder() { ... callTimeout = 0;

Android菜鸟的专栏 2192

12027.linux flash驱动之IS25LP01G/IS25WWP01G

一页:512字节 --> 扇区 4096字节 --> 块 32k,64k, 层层递进关系。

写给自己的笔记 2289

Linux运行有时间限制的命令—timeout命令

1、简介timeout是用来控制程序运行的时间,运行指定的命令。如果在指定时间后仍在运行,则杀死该进程。使用timeout命令可以让程序在指定的时间内仍然运行则强制退出。2、timeou...

yunweimao的博客 1万+

TC8:IPv4_HEADER_05-09

所有主机都必须准备好接受最多576个字节的数据报我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢。

jasonj333 512

《YOLO11改进有效涨点》 专栏目录 | 目前已有100+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck等创新点改进【持续更新】

YOLO11改进专栏目录,YOLO11改进目录

kay_545 1万+

libusb阻塞

转自:https://www.cnblogs.com/heyp/p/3421800.html 这两天发现手头一个usb指纹头出现了一点状况,若libusb以同步方式发送bulk transfer出现阻塞。经过测试发现跟timeout有些关系:若timeout为0(无timeout),不会阻塞;若timeout为1000或者2000,则会。另外,若采用异步方式传送bulk transfer,则不会...

smilestone322的专栏 3630

SAP成本核算的核心逻辑

SAP成本核算采用"计划-归集-分析"闭环管理,以CO模块为核心,集成PP、MM等模块。核算前需配置标准成本控制范围、成本中心等主数据。标准成本通过BOM和工艺路线计算(CK11N),采购和生产过程记录实际成本差异。制造费用通过成本中心归集,作业成本按实际耗用量分配。完工产品按标准成本入库,月末通过KO88结算工单差异,物料分类账(CKMLCP)还原实际成本。整个流程实现FI与CO数据同步,确保账务一致。关键事务码包括CK11N(成本估算)、MIGO(物料移动)、CO11N(报工)等。

金牌架构师 539

Nodejs中TCP(MQTT等)在断网的超时处理

文章目录1. 问题2. 解决思路2.1. Linux TCP 参数2.1.1. TCP keepalive 机制2.1.2. TCP_USER_TIMEOUT2.2. 使用 NodeJS 接口测试,只适用于没有数据发送的时候,但有数据发送则不行2.3. 从网上找相关资料,出现关键信息2.4. NodeJS C++插件2.5. 测试两种场景3. 引申 1. 问题 在做 NodeJS 开发的过程中,碰到一个棘手的问题:已建立好的 TCP 连接,在网络异常情况下(拔网线),客户端无法及时的响应(close 或 e

lxmuyu的专栏 1979

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java 模拟实现 timeout 机制

模拟实现 timeout

zhouren1314的专栏 6357

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

揭秘PHP cURL超时机制:如何正确设置connect_timeout和timeout避免服务雪崩

掌握PHP curl_setopt 的超时参数设置技巧,有效防止请求堆积导致服务雪崩。详解connect_timeout与timeout的差异与应用场景,结合实际代码示例说明合理配置方法,提升接口稳定性与响应效率,值得收藏。

DebugVibe的博客 1033

curl_setopt超时机制揭秘:如何正确设置connect_timeout和timeout避免服务雪崩

掌握curl_setopt超时参数设置技巧,有效防止因网络延迟导致的服务雪崩。详解connect_timeout与timeout的差异及合理配置方法,适用于高并发PHP请求场景,提升系统稳定性与响应效率,值得收藏。

simcode的专栏 963

elasticsearch search timeout机制

一、timeout timeout:默认无timeout,latency平衡completeness, 手动指定timeout: timeout=10ms,timeout=1s,timeout=1m GET /_search?timeout=10m 二、timeout机制 指定timeout,就能在timeout时间范围内,将搜索到的部分数据(也可能全部都搜索到),直接返回给client...

愿风裁尽尘中沙 1万+

TCP KEEP-ALIVE和TCP_USER_TIMEOUT机制

正常通信的情况下,send函数发送成功会返回发送数据的字节数。当有错误发生时,send返回-1,全局变量errno被设置。很多情况下,send返回-1是由于连接被对端关闭(对端发送了RST或者FIN包),这种情况errno会被设置为ECONNRESET(Connection reset by peer)。 可是在对端的网线被拔、网卡被卸载或者禁用的时候,对端没有机会向本地操作系统发送TCP RST或者FIN包来关闭连接。这时候操作系统不会认为对端已经挂了。所以在调用send函数的时候,返回的仍然是我们指定

时有限 3874

STM32HAL库使用HAL_GetTick()和形参Timeout实现超时退出

​ HAL_GetTick()函数是STM32 HAL库中的一个重要函数,用于获取系统启动以来的毫秒级计数‌, 该函数基于SysTick中断实现,‌每当SysTick定时器定时中断时,‌全局变量uwTick会自增1,‌表示当前系统时间增加了1ms。‌如果在这个时间内操作没有完成,‌ 函数就会停止等待并返回一个HAL_StatusTypeDef类型的状态值HAL_TIMEOUT,‌表明操作因超时而未完成, 实现跳出本句代码继续执行后续代码。HAL_GetTick()的返回值为当前时刻系统的毫秒数,

qq_43759096的博客 1万+

ElasticSearch 实战:search结果分析及其timeout机制

Elasticsearch 的searchAPI 返回的结果包含了丰富的信息,用于分析搜索性能、命中情况以及数据统计等。同时,Elasticsearch 提供了timeout机制来控制搜索请求的最长时间,防止长时间无响应导致的资源浪费或服务中断。以下是对search结果分析及其timeout。

qq_33240556的博客 1325

ES 28 - search timeout机制

例如 GET bank/_search?timeout=1s 结果 { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : { "value" : 1000, "relation" : "eq" },

xiangjai的专栏 411

Elasticsearch的timeout机制与_search结果字段释义

编程界的小学生一、_search结果1、ES语句2、结果3、结果分析二、timeout机制1、用法2、demo3、详细说明4、总结 一、_search结果 1、ES语句 GET /product/_search 2、结果 { "took" : 1, "timed_out" : false, "_shards" : { "total" : 1, "successful" : 1, "skipped" : 0, "failed" : 0 }, "hits" :

【原】编程界的小学生 1263

dubbo服务的超时(timeout)和 重试机制(retires)

节点角色说明:Provider: 暴露服务的服务提供方。Consumer: 调用远程服务的服务消费方。Registry: 服务注册与发现的注册中心。Monitor: 统计服务的调用次调和调用时间的监控中心。Container: 服务运行容器。调用关系说明:0. 服务容器负责启动,加载,运行服务提供者。1. 服务提供者在启动时,向注册中心注册自己提供的服务。2. 服务消费者在启动时,向注册中心订阅自...

Black__sheep的博客 2万+

wait_timeout 和 interactive_timeout

wait_timeout 和 interactive_timeout Table of Contents 1. 参数说明 2. 原代码 3. interactive_timeout覆盖wait_timeout 4. 总结 1 参数说明 这里简单解释一下两个参数含义如下: interactive_timeout:对于交互式客户端创建的...

weixin_30607029的博客 444

开博第一篇 TimeOut的实现

前一段时间在调查Java 的TimeOut机制,现在附上程序import java.util.Date;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;import java.util.concurrent.TimeUnit;import java.util.concurrent.Tim

603的专栏 606

Hystrix Timeout机制

因为在一个复杂的系统里,可能你的依赖接口的性能很不稳定,有时候2ms,200ms,2s,如果你不对各种依赖接口的调用做超时的控制来给你的服务提供安全保护措施,那么很可能你的服务就被依赖服务的性能给拖死了,大量的接口调用很慢,大量线程就卡死了。 (1)execution.isolation.thread.timeoutInMilliseconds   手动设置timeout时长,一个command运行超出这个时间,就被认为是timeout,然后将hystrix command标识为timeout,同时执行

xwnxwn的专栏 792
上一篇: 好想酣畅的打一场球
下一篇: 查找函数实现所在的库的shell脚本
古灵古怪
博客等级 码龄18年 21粉丝 40原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值