Tornado 异步源码解析

前言 tornado在我工作前说实话我还没有听说过,今年回来后接触的非常多。 关于想要学习异步的内容,起因是如下场景: tornado拿到请求后,对他的处理时间非常的长,一般大概有10s,晨旭让我把他写成异步的,如果只是对请求异步的是相当好写的。就是十分传统地在收到请求后立即返回,然后进行处理,处理了之后再返回给给定的callback_url。 但我突然想到,能否对这整个处理进行异步,将其放到后台运行,然后继续接收请求不至于在请求上堵塞。 最后是没实现出来……坤爷让我去花时间了解一下tornado所著名的异步。于是我才发现,我这想法在tornado的异步中是不可行的。(而且错误的地方还蛮多的…… 异步使用方式 from tornado import gen @gen.coroutine def fetch_coroutine(url): http_client = AsyncHTTPClient() response = yield http_client.fetch(url) raise gen.Return(response.bo…

iota - Go中优雅的常量

常量计数器 iota 其实可以对标 C++ 中的枚举,但显然 iota 比枚举更加优雅且更加友好。 iota 是一个常量计数器,(注意它的对象必须是个常量),当你给一个常量赋值为 iota 时,从当前行开始,随着逐行往下,iota也会逐渐 +1 。 举个例子 const ( v1 = iota v2 v3 ... ) 上面代码的结果是 v1 = 0, v2 = 1, v3 = 2 支持表达式 iota支持表达式,比如我在赋值的时候给的是 v1 = 11 * iota 那么 v1 = 0, v2 = 11, v3 = 22,以此类推 支持跳过 iota支持跳过某一个值,你只需要在这一行的常量写为 _ 即可。 支持自定义和重新定义…

锐捷multi-NIC问题频繁断网解决

本校校园网用的是锐捷,在linux中的使用方法是 sudo rjsupplicant.sh -a 1 -d 1 -s wireless -u username -p password 然而有时候会频繁出现断网情况,这个情况不止出现于linux,而在windows下反而更难搞 如图 其实稍微会点英语的的话,自己读一下,它的意思就是说,“本机使用了多网卡,请把未认证的网卡关闭,再重新认证” ok,就是只要关一下网卡就好了,网卡的话,一般用 ifconfig 就好了。单纯使用 ifconfig 查看开启的网卡: 之后调用ifconfig 关闭,关于关闭的网卡的话,在使用锐捷时它显示的Adapter那个是要保留的,其他关闭即可。 sudo ifconfig wlp4s0 down sudo ifconfig lo down 最后重新认证一下就可以了。 然而一直这样的话还是会有点麻烦,你也可以在…

进程与线程

进程与线程的区别在面试题中非常常见,然而大多数人一般都只是网上找资料,背背下来就完事了(就和我应对epoll面试题一样……)本文将从一些底层角度去剖析进程与线程——主要是从linux内核角度。 首先还是贴一下我对于这种面试题的一些常规回答: 1. 线程的划分尺度小于进程,简单说是一个程序至少有一个进程,一个进程至少有一个线程。 线程是cpu调度的 基本单位,进程和线程都能创建和撤销线程;同一个进程内的多个线程之间可以并发执行。 2. 进程拥有独立的地址空间和其他资源,而同一个进程中的线程共享(当然各自也会有一些用于运行必不可少的 资源)。这就意味着一个进程崩溃,在保护模式下,不会影响到其他进程,而一个线程崩溃,其同一进程内的 所有线程都会崩溃。因此,多进程比多线程更健壮,但一般来说多进程效率较差,因为线程切换代价较小。 3. 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出 口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控…

对一致性hash的一些理解

传统hash方法有个令人诟病的缺点,就是在容量不够需要扩容的时候,所有原先存储的值都需要重新进行hash映射。 而一致性hash的目标就是为了解决这个缺点而相出的hash算法,尽可能地让重新hash的原值数变少。 附带一个中文wiki 一致hash只是一种想法,真的算法实现各有名称。 根据我对网上所说的最简单的一致hash方法的理解。这里我也简单说一下。 假设我的hash容量有 cap ,而我们实际的hash范围会比这个更大,为的是将一块区域的数值划分给槽,(所谓槽,是我的个人习惯。因为hash在我看来像是被分配到一个槽或者桶里,这里简称被hash之后的所有数值为槽)。 而每当增加一个槽(扩容),最简单的方法就是将相邻的槽里的一部分 分给新的槽。而每当减少一个槽(缩容),最简单的方法就是将它存储的数字转交给相邻的槽。 无论是扩容还是缩容,这个最简单的操作都能够使得重新hash的数量尽可能少。 然而,这个最简单的方法当然是不靠谱的,因为它首先在负载上是根本谈不上均衡的。 一个可行的解决办法是。 将原先的cap个大区域,分成cap个 若干小区域的集合。 怎么说…

久违的更新

2018.8.2,距离我第一次来到百度已经2个月之久,(虽然中间有半个月的考试请假..) 在说实习感想之前,很想分享一下今日份的欣喜与忧愁交加的情绪.今天华姐(我们的经理)无意中在我边上问晨旭哥(带我的mentor) :"他已经能独立干活了么?" :"已经可以了,都已经迁移了一个垂类了" 开心! 这是毋庸置疑的,但是这份欣喜并没有持续太久,因为我也是知道自己有几斤几两的。。。老实说,那个迁移工作在我看来也是很整体的杂活。。要说收获的话,应该是对框架和流程的整体把握有了个清晰点的概念..毕竟这些代码我都是一边看一边改的,除此之外的话,就只剩一点 C++ 的技巧了,(但大多不是C++ 11 的。) 所以总的来说,就是觉得收获的知识非常少。。而且不仅如此,在真正独立解决需求上,也远远不足。比如说,前天给我一个小需求,dnn并行请求视频,给我的估计时间是一天,现在已经是第二天结束了。。 前天下午给的需求,一口承诺昨天可以完成,而昨天策略的朋友晚上还来催我,"今天可以完成么?",我没敢直接回答.而事实上今天回去之前还发现了个大问题,本来想今晚回来赶一下的,结果发现 vpn 连不…

debug工具Valgrind使用简介

腾讯teg挂了之后昨天又被其他部门捞起来了,面了20分钟左右,前面基本畅通无阻,但是问到如何检测内存泄漏的时候懵比了…………卒 介绍一个比较实用的工具 Valgrind,英文海星的朋友可以点这个 链接。一个新手教程。 Valgrind它在实质上还是一个debug工具集合,而其中最受欢迎就是 memcheck,用于检测内存泄漏。 其所有检测内容包括(个人总结 * 内存泄漏 * 使用未初始化的内存 * 内存越界 * 读写已经释放的内存 * 重复释放 内存泄漏 valgrind默认使用 memcheck参数来检查内存泄漏。所以一般只要 valgrind 程序名 即可。 比如源程序 #include void func() { char* ch = new char[10]; ch[0]='1'; } int main() { func(); return 0; } 对其进行检查 ╰─○ valgrind ./learn ==26826== Memcheck,