教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang中实现select超时机制

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> 到此这篇关于“golang中实现select超时机制”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
go语言之进阶篇 select实现的超时机制
Go语言channel超时机制
如何在golang中关闭bufio.reader_golang 并发编程
golang中实现select超时机制
golang常驻后台类worker模板
golang 订阅发布机制实现
go语言并发编程
Golang 长连接的时候是怎样做心跳机制的
数据结构和算法(Golang实现)(10)基础知识-算法复杂度主方法
golang中sync和channel同步机制

[关闭]
~ ~