【编程小贴士】写代码也需要灵活的走位

队列轮询代码怎么写才能不挖坑?

系统提示:
敌方出动了超级兵——宫本武藏
并对你大吼了一声“天下无双”!
那么作为被盯上的小短腿还能挣扎一下么?打王者荣耀,不会蛇皮走位躲技能?猴子说了,“道行太浅,不如回家做宅男”!同样的是,写代码还总是老套路,经常挖坑?高级复制粘贴工程师告诉你:“您该看书了”!

队列轮询代码

想象这么一个问题,假如问题需要轮询一个队列,并打印出队列内的值,你要怎么写?我想大部分的开发者都会写出这样几行代码核心函数:
功能用多线程实现,一个线程feed数据到queues,另外一个线程调用consumer函数,轮询queues队列并取出打印队列内的值。这里大家应该看到一个明显的细节:consumer函数中在while循环中调用了sleep函数,每次循环sleep10毫秒,这是多数“老司机”的经验手法。通过sleep让出cpu时间,防止程序空跑浪费资源,但是这里也隐藏着一个坑,那就是如果数据量很大的时候,10毫秒的sleep时间会拖慢性能成为瓶颈!那还有什么其他方法来解决这种非类文件对象的轮询问题么?

高级复制粘贴工程师说“还真有”!

多线程轮询队列

那就是创建一个可多线程轮询的队列,核心是利用socket pair实现,封装方法在这里:

轮询方法如下:

这个方法的核心:

对于想要轮询的队列,创建一对连接的套接字;

通过在put套接字上编程来实现数据到达的通知,将get套接字传递给select等事件轮询函数;

在unix上可以直接调用socketpair()函数创建这样的套接字;

windos上还需要模拟一下,以上代码可以参考

其中fileno()通过select函数使得这个队列可以被轮询

最后可以提个小问题,你对socket的文件描述符了解么,可不可以试着讲一下有关socket文件描述符的相关知识?

了解socket就能自然地拓展很多知识面,比如tornado的协程调度,连接的并发处理等…

 

 

 

发表评论