一直没有系统的学过python,但是每次都是网上看一些现成资料。写一些小脚本。不知道自己入没入门。一直时断时续的看一些基础语法。现在想通过做一个东西让自己熟悉一些。所以有如下疑问:
1.怎么判断一个socket server中的操作是阻塞或者是非阻塞的。如何用简单明了的代码测试出来阻塞与非阻塞的明显区别。这样非常直观的让我理解这个机制
有这种示例代码么。我在网上找了很久也没有。我说的是使用原生python编写 不是利用第三方已经写好的异步或者non-blocking模块
2.我在做一个带健康检查的DNS服务,其实就是一个python socket 脚本。我对他的规划是 一个主体的DNS socket server 的脚本。然后 一些check的脚本。这些check的脚本去检测我checklist的一些服务。然后判断他是否能对外界服务。最后check脚本返回一组可用服务的IP。而我在DNS socket server
中 import 这些check模块。按照返回的ip列表 随机返回一个IP响应外部的解析请求。这样既做到了健康检查。而且可以很智能调度访问.又可以做到负载均衡.
但是。有一个bug 。我测试时候故意停掉后端一个服务。发现DNS还是返回了后端正常时的IP列表。后来到网上查了一下发现 import 模块里边定义的变量的值是一直不会改变的。除非重新import. 但是我脚本里不可能这么写。 现在需要实现这个值能跟随每次检查而变动。而且能体现在我主体的DNS SOCKET server里。这样就能动态的增删后端节点
第二个问题是。我这个服务如果check模块变多以后。会影响响应的速度。我如何实现一个高效率的checker,是使用线程,还是进程,还是异步。哪个比较好一点。我想要实现这些checker是非阻塞的我这个服务才快得起来。
最后贴上已经实现的代码吧 :(请勿在饭后阅读):
DNS-SERVER :
https://gist.github.com/1332783check_ping:
https://gist.github.com/1332789请大家给我些建议。
fcicq
2011-11-04 22:07:23 +08:00
1 对于默认 socket, 没有 gevent / stackless python 这类的修改, 就全部是阻塞的.
tornado / twisted 是自己实现了一套, 没有暴露原始的 socket.
2 你不理解 DNS.
DNS 的结果会被缓存比较长的一段时间, 不要以为 DNS 上不返回失效的 IP, 就不会有人访问了. 用这个做负载均衡虽说是可以的, 但不要把 checker 和 DNS 联系到一起. 高可用的正常做法是 LVS 或者硬件负载均衡器, 而不是你山寨的玩意.
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/20588
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.