golang中实现select超时机制
发布时间:2022-02-23 编辑:jiaochengji.com
教程集为您提供golang中实现select超时机制等资源,欢迎您收藏本站,我们将为您提供最新的golang中实现select超时机制资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg>
对于c/c 开发来说,有和os最为贴切的api可以用,例如
带超时机制的互斥锁
<pre><code class="lang-c hljs"> #include <pthread.h>
#include <time.h>
int pthread_mutex_timedlock(pthread_mutex_t *restrict mutex,
const struct timespec *restrict abstime);
</code></pre>
带超时机制的epoll
<pre><code class="lang-c hljs"> #include <sys/epoll.h>
int epoll_wait(int epfd, struct epoll_event *events,
int maxevents, int timeout);
int epoll_pwait(int epfd, struct epoll_event *events,
int maxevents, int timeout,
const sigset_t *sigmask);
</code></pre>
等。
但是对于golang这样一个新的语言来说,需要完善的地方还有一些。例如一些开源组件的重写,cordis、mysql等用golang重写,有些api确实不那么完善。
对于多路复用来说,不可能一直等待信号。万一发信号的死掉了,经常岂不是傻傻的等着了吗。所以有超时机制。
golang 虽然没有原生的api可以满足条件,但是可以组合一下,在应用层实现这种功能。(这也符合linux微内核的设计思想)
<pre><code class="lang-go hljs"><span class="token keyword">package</span> main
<span class="token keyword">import</span> <span class="token punctuation">(</span>
<span class="token string">"fmt"</span>
<span class="token string">"time"</span>
<span class="token string">"strconv"</span>
<span class="token punctuation">)</span>
<span class="token keyword">func</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
ch <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">chan</span> <span class="token builtin">string</span><span class="token punctuation">)</span>
quit <span class="token operator">:=</span> <span class="token function">make</span><span class="token punctuation">(</span><span class="token keyword">chan</span> <span class="token builtin">bool</span><span class="token punctuation">)</span>
<span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">for</span> i <span class="token operator">:=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">;</span> i<span class="token operator"> </span> <span class="token punctuation">{</span>
ch <span class="token operator"><-</span> strconv<span class="token punctuation">.</span><span class="token function">Itoa</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span>
time<span class="token punctuation">.</span><span class="token function">Sleep</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">go</span> <span class="token keyword">func</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
timeout <span class="token operator">:=</span> time<span class="token punctuation">.</span><span class="token function">After</span><span class="token punctuation">(</span>time<span class="token punctuation">.</span>Second <span class="token operator">*</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token comment">// 注意,定时器必须放在select外面</span>
flagrun <span class="token operator">:=</span> <span class="token boolean">true</span>
<span class="token keyword">for</span> <span class="token punctuation">;</span> flagrun <span class="token operator">==</span> <span class="token boolean">true</span> <span class="token punctuation">;</span> <span class="token punctuation">{</span>
<span class="token keyword">select</span> <span class="token punctuation">{</span>
<span class="token keyword">case</span> <span class="token operator"><-</span>timeout<span class="token punctuation">:</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"2 second timout,then send one message to channel quit ,and exit for loop and goroutine"</span><span class="token punctuation">)</span>
flagrun <span class="token operator">=</span> <span class="token boolean">false</span>
quit <span class="token operator"><-</span> <span class="token boolean">true</span>
<span class="token keyword">case</span> str <span class="token operator">:=</span> <span class="token operator"><-</span>ch<span class="token punctuation">:</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"string: "</span><span class="token punctuation">,</span> str<span class="token punctuation">)</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token operator"><-</span>quit
<span class="token function">close</span><span class="token punctuation">(</span>ch<span class="token punctuation">)</span>
<span class="token function">close</span><span class="token punctuation">(</span>quit<span class="token punctuation">)</span>
fmt<span class="token punctuation">.</span><span class="token function">Println</span><span class="token punctuation">(</span><span class="token string">"endof process"</span><span class="token punctuation">)</span>
<span class="token punctuation">}</span>
</code></pre>
<blockquote class="layui-elem-quote" style="width: 100%;overflow:hidden">
作者: jacky128256
链接: https://blog.csdn.net/jacky128256/article/details/104659558
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
</blockquote>
到此这篇关于“golang中实现select超时机制”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
go语言之进阶篇 select实现的超时机制
Go语言channel超时机制
如何在golang中关闭bufio.reader_golang 并发编程
golang中实现select超时机制
golang常驻后台类worker模板
golang 订阅发布机制实现
go语言并发编程
Golang 长连接的时候是怎样做心跳机制的
数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
golang中sync和channel同步机制