【1】 pythonic modern c++:字符串

2016-10-03
阅读 2 分钟
4.7k
致力于在现代C++中提供Python的编程体验。这个建立在两个关键的基础上 c++ 11/14/17 提供了从 auto 到 structure binding 的语法便利 [链接] 提供的 range 抽象 但是 python 体验是建立在语言内建的大量方便函数的基础之上的。而 Modern C++ 还缺少大量使用起来方便的库。 我们今天要来解决的第一个问题是如何在C++中表...

【妙用协程】 - 可resume的异常处理

2015-08-05
阅读 4 分钟
4.5k
这段代码打印出!!!而不是???,因为resume的时候把执行重新跳转回interrupt的地方了。这种行为类似vba里的on error resume next([链接])。

【generator101】 - pypy的api

2014-09-17
阅读 1 分钟
2.8k
从generator到greenlet到stackless再到pypy,各家的语法都不太一样。pypy底层的实现是continulet,看名字应该是continuation的意思。然后在这个基础上实现了stackless的api和greenlet的api。这种实现都是在用户代码里,而不是在解释器的内置库里实现的。

【generator101】 - stackless的api

2014-09-15
阅读 2 分钟
3k
与greenlet的代码不同,当一个协程希望切换出去的时候,它无法指定把控制权交给谁。在stackless的api里没有父子协程的概念,无法像generator那样一个yield跳回到父,也无法向greenlet那样greenlet.getcurrent().parent找到父然后跳回去。stackless里就一行

【generator101】 - 对比generator和greenlet

2014-09-15
阅读 1 分钟
3.1k
这里可以看出parent_generator为了在hello和world之间中断,必须显式的用yield from把控制权从自己手里转交给调用者。如果parent_generator没有使用yield,那么sub_generator里即使有yield也无法使得parent_generator的执行权转交出去。所以从视觉上可以一步了然的指导一个函数中哪些调用是产生了switch的,哪些是肯定顺...

【generator101】 - yield from

2014-09-15
阅读 2 分钟
3k
在python 3.3里,generator新增了一个语法 yield from 这个yield from的作用是什么?看下面两段对比的代码:

【协程原理】 - cPython的VM真变态

2014-09-15
阅读 2 分钟
3.7k
kilim在JVM上实现了协程,其实现看起来挺容易的:[链接] 在cPython上是否能够复制其技法呢?粗看上去,是很容易的,甚至比JVM更好实现:

【协程原理】 - 为什么greenlet的状态无法被保存

2014-09-13
阅读 3 分钟
5.8k
python主流的协程实现有五种: cPython的generator cPython的greenlet cPython的fibers stackless python pypy 除了stackless python和pypy的实现版本之外,其余的协程都实现都无法保存状态。特别是最火的协程框架greenlet也无法保存状态,让人非常惋惜。使用stackless python在公司内部的项目里实现了在一台服务器上跑...

【妙用协程】 - 单元测试的setUp和tearDown

2014-09-13
阅读 1 分钟
6.7k
很多测试都需要在启动的时候做一些事情,然后在结束的时候再把做的事情给清理了。一般的做法是把这些动作写在setUp和tearDown的两个方法里,单元测试框架会负责在开始和结束的时候调用这两个方法。

【妙用协程】 - 诡异的web框架

2014-09-11
阅读 2 分钟
3.4k
在史前的web开发时代(我说的是AngularJS工程师开始变得价值不菲之前的黑暗岁月),web开发的一个痛点在于HTTP是一个无状态的协议,浏览器是一个无状态的展示表单提交工具。当然现在的web开发世界已经不再是如此了,浏览器已经俨然是一个全功能的客户端了,B/S和C/S架构的差异已经接近弥合。在那个年代,有一些人就想,...

【tulip】 - IOCP

2014-09-11
阅读 2 分钟
4k
为了让I/O阻塞的时候,程序还可以去干别的。除了使用线程模型,让操作系统的内核去调度多个线程,Windows提供了IOCP机制。简单来说就是一个操作系统提供的回调机制。分成四个步骤

【tulip】 - 多进程的版本

2014-09-10
阅读 2 分钟
2.5k
其中os.fork()之后会创建一个子进程。子进程默认会继承所有父进程的所有file descriptor(也就包括打开的socket),已经拥有fork前父进程的所有内存状态。所以子进程可以拿着父进程打开的conn_sock继续与客户端通信。而父进程在把conn_sock交给子进程之后,就不再需要开着这个socket的fd了,所以就需要关闭掉。否则,子...

【tulip】 - 多线程的版本

2014-09-10
阅读 2 分钟
2.3k
变成多线程之后,就可以有多个客户端同时连接到服务器并同时进行服务了。最重要的是每个线程,对应了一个“serve”函数的执行。所以函数执行就是有一个函数的栈,栈上有一个函数的参数和局部变量。最重要的一个局部变量就是conn_sock,有了这个socket就可以和对应的客户端进行对话。 机器都有一个ESP的寄存器指向函数的栈...

【tulip】 - I/O阻塞的小例子

2014-09-10
阅读 1 分钟
2.6k
接下来,会把Python tulip这个网络库(也就是3.4之后的asyncio)如何实现的进行一些分析。在了解了tulip的实现方式的基础之上,希望能够把流程阻塞的功能在tulip的框架之上实现,从而可以制作一个简单的类似ansible,saltstack这样的集群调度工具。 我们先来看一个最基本的网络编程的例子

【妙用协程】 - I/O阻塞和流程阻塞

2014-09-10
阅读 2 分钟
3.2k
咱不咬文嚼字地掰什么是Blocking I/O,什么是Async I/O,没啥意思。代码是用来解决问题的。有的时候透彻理解问题,会比透彻理解某个具体的解法更重要。 I/O阻塞的问题来源就是,当我们需要输入输出的时候,特别是通过网络传输数据的时候。从请求发出,到得到对方的应答确认是一段时间的。比如说代码中调用

【协程原理】 - 协程不过是用户态的线程

2014-09-10
阅读 2 分钟
10.2k
笔者最美好的记忆来自于早年在6502 cpu的cc800上写汇编的年代, 那个时代的计算机甚至没有操作系统,也没有实模式等保护机制。在6502上写汇编应用其实非常简单,系统会把bin文件加载到一个固定的内存地址中,cpu会固定地从一个特定的位置开始执行。然后cpu就按照你提供的机器指令开始一条一条的执行。在高级语言中的“函...

【妙用协程】 - 协程当然可以用来处理I/O阻塞问题

2014-09-09
阅读 2 分钟
9.3k
前面讲的两个协程的用途,一个是用来使用协程表达工作流里的流程的概念,一个是用协程来表达一个动画的播放过程。总结起来,就是用协程来解决带有流程阻塞的代码逻辑组织的问题。但是协程并不是生来干这个的,协程最主流的用途是一种用于处理I/O阻塞的工具。I/O阻塞的挑战是多重的,一方面是有很多人研究高并发低延迟之...

【妙用协程】 - 可持久化的协程能被用来实现工作流

2014-09-07
阅读 3 分钟
3.9k
常规版本的Python的generator是不可以被持久化保存的。但是stackless和pypy这两个修改版本的Python解释器可以。下面这段代码演示了如何把一个执行中的函数持久化保存,然后过段时间再把函数从上次执行到的地方原样拉起。从效果上来说,有点类似于Vmware虚拟机的snapshot的功能:

【generator101】 - generator是一种显式控制的协程

2014-09-07
阅读 1 分钟
3.2k
Python官方的实现里,协程只有generator这一招。协程其实就是一个可中途中断,由外部来控制执行进程的函数。除了官方的generator,还有很多第三方的实现可以选择。常见的第三方选择有:

【generator101】 - generator的输入与输出

2014-09-07
阅读 1 分钟
3k
Python的generator是可以有输入输出的,这个特性并不广为人知。这其实是一个挺有用的特性,利用其外部可控制执行进度的特性,再加上可以与外部进行输入输出,generator可以被用来打造成一个异步执行框架,或者说是协程调度引擎。 我们先来看一个最简单的例子,generator如何接受外部的输入

【generator101】- generator是可以被外部控制执行进度的函数

2014-09-07
阅读 1 分钟
3.4k
很多码农终其一生可能在代码上干的事情无非就是追求两件事情:Logic Locality 和 Data Locality。前者决定了开发效率,后者决定了运行效率。协程是用来处理I/O阻塞和流程阻塞这两个普世问题的得力工具,可以达到比较好的Logic Locality。