聊聊网络事件中的惊群效应
关于惊群问题,其实我是在去年开始去关注的。然后向 CPython 提了一个关于解决 selector 的惊群问题的补丁 BPO-35517。现在大概来聊聊关于惊群问题那点事吧 惊群问题的过去惊群问题是什么?惊群问题又名惊群效应。简单来说就是多个进程或者线程在等待同一个事件,当事件发生时,所有线程和进程都会被内核唤醒。唤醒后通常只有一个进程获得了该事件并进行处理,其他进程发现获取事件失败后又继续进入了等待状态,在一定程度上降低了系统性能。 可能很多人想问,惊群效应为什么会占用系统资源?降低系统性能? 多进程/线程的唤醒,涉及到的一个问题是上下文切换问题。频繁的上下文切换带来的一个问题是数据将频繁的在寄存器与运行队列中流转。极端情况下,时间更多的消耗在进程/线程的调度上,而不是执行 接下来我们来聊聊我们网络编程中常见的惊群问题。 常见的惊群问题在 Linux 下,我们常见的惊群效应发生于我们使用 accept 以及我们 select 、poll 或 epoll 等系统提供的 API 来处理我们的网络链接。 accept 惊群首先我们用一个流程图来复习下我们传统的 accept...
关于 pyright
关于 pyrightPEP 484,出来也快四年了。正好今天看到一个新库,写个短文,安利下&吐槽下。 关于 PEP 484PEP 484,14年正式提出,15年正式接纳,成为 Python 3.5 以后的标准的一部分。简而言之是通过额外的语法,来为 Python 引入静态类型检查的例子 举个简单例子 1234def return_callback(flag: bool, callback: typing.Callable[[int, int], int])-> int: if not flag: return None return callback(1, 2) 我们通过这样的类型静态标注,来增加可读性以及静态检查的能力。具体内容,可以参看我去年在 BPUG 上的分享的 slide。我最近也会抽出时间,详细聊聊 Type Hint 的前世今生(flag+1) 静态检查静态检查的意义在于,能及时发现低级错误,及时检查,可以很方便的集成进 CI 或者 Git Hook 中 举个简单例子 目前而言,主流的静态检查工具有两种 Python...
2018,我,2019,未来
2018,我,2019,未来本来以为年前没有机会发这篇年终总结以及新年展望。不过目前去向已经确定,所以准备还是写一篇文章纪念下2018这一年,赶在农历戊戌年的末尾发一篇文章出来吧。 2018,我2018...
听说我有女朋友
听说我有女朋友我很喜欢写听说系列文章,从入行开始写的第一篇《听说你会 Python》。所以半年了,我干脆也来写一篇《听说你有女朋友》。为啥要今天写?因为明天她送的新键盘要到了,正好老键盘退役,写点啥纪念下 怎么认识的?很多人都会问我这样的问题:”你一个技术男咋和学音乐的认识了?“,我一般这么回答:”知乎认识的“(请知乎给我广告费,明天之前打到我支付宝上 好了,正经说,我们的确算是在知乎上认识的(广告费+1)。当时我们在一个知乎群里,然后后面加上了好友。 很多时候,我这个人有个毛病,加了女孩子之后不怎么聊的。不过幸好,我们最开始有个共同的爱好,养猫。她家的是一只橘猫。我家是母女两。某种意义上讲,这三只猫是我们俩的媒人(回去加罐头) 正式开始聊起来,应该是开学的时候,她当时睡眠不太好。某天晚上,睡前戏称保佑她肯定睡得好之后。第二天她说昨晚居然还真睡得不错(直男如我我现在都不知道我的功力是不是有那么强。问她她也不说,摔) 借着这个契机,就开始聊了起来,包括不限于互相点外卖犒劳对方上课/上班的无奈。出来约了两次火锅(直男撩妹法) 11月初,当时做完18年的...
去 async/await 之路
去 async/await 之路看到彭总写的文章这破 Python,感慨颇多,我也来灌水吧。 首先,我司算是在国内比较敢于尝试新东西的公司吧,最直接的提现就在于我们会及时跟进社区相关基础服务的迭代,并且敢于去尝试新的东西。嗯,从去年6月到现在,我司在线上推行了很长一段时间的 async/await ,并且引入新的注入 Sanic 这样全新的框架,但是不得不说,我们现在要对 async/await 暂时的说再见了。 我们为什么选用 async/await ?和我们组具体场景有关,我们组有相当一部分场景,是根据不同的 URL 去不同的子服务请求数据,组合之后,再进行下一步的统一处理。那么这个时候,传统的同步的方式在数据源越来越杂的情况下就显得很无奈。 我们当时有这样几个选择: 维护进程/线程池,利用通用的进程/线程来处理请求 利用 Gevent 这样第三方的 coroutine+EventLoop 方案 使用 async/await + asyncio 这一套 首先,1被我们排除了,原因很简单,太重了。2最开始也被我们暂时性的排除,当时我们对于 monkey-patch...
她曾以为自己能逃开教授的手丨人间
她曾以为自己能逃开教授的手丨人间 《不能说的夏天》剧照 ...
外国语学院-情况说明
...
怎么样去理解 Python 中的装饰器
怎么样去理解 Python 中的装饰器首先,本垃圾文档工程师又来了。开始日常的水文写作。起因是看到这个问题如何理解Python装饰器?,正好不久前给人讲过这些,本垃圾于是又开始新的一轮辣鸡文章写作行为了。 预备知识首先要理解装饰器,首先要先理解在 Python 中很重要的一个概念就是:“函数是 First Class Member” 。这句话再翻译一下,函数是一种特殊类型的变量,可以和其余变量一样,作为参数传递给函数,也可以作为返回值返回。 12345678def abc(): print("abc")def abc1(func): func()abc1(abc) 这段代码的输出就是我们在函数 abc 中输出的 abc 字符串。过程很简单,我们将函数 abc 作为一个参数传递给 abc1 ,然后,在 abc1 中调用传入的函数 再来看一段代码 1234567def abc1(): def abc(): print("abc") return...