FunCoder

FunCoder

用Python重建Go并发模型 1

主要译自Go Concurrency from the Ground Up

通过实现 Go 的并发模型增加对并发的理解和使用。

本文一共四个部分,部分1 针对前两个,后面两个在部分2:

  • 设计:介绍 Go 的并发模型基本API
  • 实现1:实现一个非抢占、单线程的 goroutine 调度器
  • 实现2:带缓冲的 Channel
  • 实现3:Async/Await 范式实现
Read more »

Go 学习笔记5 并发编程

Go 的一个主要的特征是对多核并发的支持,特别是 CSP(Communicating Sequential Processes) 模型。Go 主要支持两类并发模型:CSP 和 共享内存。

CSP 模型

Go 的 CSP 模型主要是通过 goroutine 和 channel 两个基本模块完成的。

Goroutine (协程)

Read more »

Go 学习笔记3 程序的构成

基本规则

Go 采用驼峰命名:thisVarIsGood。如果一个 package 中的函数采用大写字母开头,这个函数可以被外界调用,否则隐藏,比如 fmt.Println

Go 的声明语句主要有四种:var, const, type, func

var,变量声明:var name type = expression。如果省略 expression 的部分,Go 会给变量合法的初始值。:= 表达式,是简化的声明。

Read more »

Go 学习笔记4 抽象模式

Go 的抽象方法主要通过函数、方法和接口三种方式。

函数,Function

Go 中函数是一等公民,可以被传递、返回,具有类型,是组织程序的基本元素。

1
2
3
func name(params-list) (returns-list) {
body
}
Read more »

Go 学习笔记2:语法和语义

这个部分主要总结 Go 涉及的基本语法和语义,即之前提到的前两个角度。

整体印象

  • 语法简单
  • 过程式语言 + 函数一等公民
  • 通过结构体 + 接口实现抽象
  • 协程并发
  • GC,value-oriented language
  • FFI支持很好

Go 的语法比较简单,涉及到的关键字大约只有27个,对比 Python 大概有33个,而 Rust 则超过40个,Java 保留了约52个关键字,而 C++ 则保留了超过90个关键字。

Read more »

重新认识 Python(8)PyObject

开发环境设置和入门请看:https://zhuanlan.zhihu.com/p/358690339

本片主要介绍 Python 对象的内存构成,以及如何组织对象的方法。更多内容可以看: https://wangzhe3224.github.io/

PyObjectPyTypeObject

PyObject 可说是 CPython 最核心的数据结构了,在 Python 的世界里,几乎任何元素都是 PyObject 的指针(注意这里是指针,不是实际内存空间)。

Read more »

Go 学习笔记 1

我是一个有5年 Python 开发经验的混迹在量化交易行业的后端程序员,这个系列开个坑学习 Golang。为什么选择 Go?

“A language that doesn’t affect the way you think about programming is not worth knowing.” —Alan J. Perlis (1922-1990)

图灵奖的第一任得主,图灵说如是:一个语言如果不能影响你对编程的看法,那么这个语言不值得学习。所以这些年接触了奇奇怪怪的语言:Clojure,Ocaml,Erlang等等。Go 我刚开始看到的时候觉得另类:看起来是 C 系的,不赶时髦,支持的功能异常少。但是有理由相信这是一个工程导向的,年轻的语言,没有沉重的历史包袱,出生在多核并发时代。

我觉得他会改变我对并发和现代软件工程的看法。

Read more »

让 Python 加速飞

Python 是一个开发很快的语言,相应的他不是一个运行速度很快的语言。原因呢,主要是动态类型设计,导致类型需要在运行时检查。在一般的应用中,特别是 IO 密集应用里,性能往往构不成问题。

对于 CPU 密集问题,Python 的科学计算生态其实非常好,得益于 CPython 的 C API,numpy, scipy 已经把科学计算性能提升了一个档次,深度学习基本也是python API的天下了。这些库已经把性能瓶颈从 Python 中剥离了。

其实 Python 最致命的性能问题在于循环,一旦代码中出现了大量循环计算,又没有现成的 numpy 函数可以用,性能往往就会成问题。今天我们介绍两个主要的方法,让 Python 的循环飞起来。这两个工具是:CythonNumba

Cython

Read more »

重新认识 Python(7)CPython初探

CPython 是 Python 社区的标准,其他版本的 Python,比如 pypy,都会遵行 CPython 的标准API实现。想要更深入的认识 Python,就需要了解 CPython 实现。这一期,我就带大家认识一下 CPython 源代码,为日后改造 Python 做准备。首先,展示如何本地编译最新的 CPython代码。然后,展示如何 debug 编译好的解释器。最后我们会利用 CPython 实现简单的函数调用。

本文会为你揭开 CPython 的面纱,带你进入 C + Python 的世界。文章的最后,你也会对 Python 中最重要的概念:一切皆对象(object)有更深刻的认识;你还会发现一点点线索,为什么Python用起来比其他语言,比如 C 慢很多。

请打开编辑器和命令行,我们开始。(本文主要使用MacOS,Windows 不一定可以直接实现)。

当我们再说 Python,我们在说什么?

Read more »

重新认识 Python(5):再谈并发

之前写了一个关于Python并发模型的小文,主要讨论利用协程实现并发的一些基本方法和规则,文章的重点是 coroutine 的使用。这两天琢磨了一下为什么 Python 要提出基于协程的并发模型,以及跟线程、进程实现的并发有什么区别和联系?最后,我还想简单讨论一下这三种并发模型是否协调在一起工作。

进程、线程、协程并发的特点

首先明确明确一点,Python一般的协程库,比如 asyncio ,不存在任何并行,即一个时间只有一个任务(协程或者普通函数)在运行。而线程和进程在多核CPU的情况下通常是存在并行的,不过由于Python的GIL,Python的线程不存在并行计算,即使运行在多核CPU上。

我们再来看这三个模型的特点。

Read more »
0%