GO 语言并发模型
哲学
不要通过共享内存来通信, 应该通过通信来共享内存
进程、线程、协程
进程
- 操作系统中最核心的概念是进程。
- 进程是“程序执行的一个实例” ,担当分配系统资源的实体。
- 进程创建必须分配一个完整的独立地址空间。
- 让计算机能够同时处理多个任务,操作系统有了进程的概念, 而且在进程内部,基本可以认为当前系统只有一个进程在运行, 操作系统对此作了非常好的封装。进程间的切换是有操作系统来完成的。
线程
线程是进程的一个执行流,独立执行它自己的程序代码。 线程是操作系统能够进行运算调度的最小单位。
线程的问题是:
1)存在线程安全问题,出了问题非常不易定位。
2)进程内部有线程数目的限制。
3)随着并发量的增加,线程生成和切换的成本也变得昂贵。
协程
- 协程不同于线程的地方在于协程不是操作系统进行切换, 而是由程序员编码进行切换的,也就是说切换是由程序员控制的, 这样就没有了线程所谓的安全问题。
- 所有的协程都共享整个进程的上下文,这样协程间的交换也非 常方便。
缺点:协程的缺点可能是无法利用多核优势。
简而言之:编程语言提供的一种并发机制,不受操作系统的调度,由 程序员来控制。
并发编程难度
并发编程的难度在于协调,而协调就要通过通信。
并发通信模型: 共享数据和消息。
基于内存的消息通信缺点:
我们还能用多线程干活,只是因为我们手里还有加锁机制,
而它可以部分地堵上线程模型的漏洞。讽刺的是,
引入加锁机制解决问题的同时,又带来了新的问题,
所以我们编写多线程程序总会遇上死锁,活锁,优先级反转……等等。
基于消息共享内存的优点:
- 抹去共享变量。(解决资源竞争问题)
- 异步传递消息。
- 可控制。
个人理解: 基于内存的消息通信最大的缺点就是程序员不可控制,它是由 操作系统控制的,而基于消息的并发模型是程序员可以控制的。
go语言并发编程
goroutine 是协程的实现,由Go runtime管理,使用只需要
go 关键字开启。
channel 是goroutine间的传递消息的通道。(类似Unix中的管道)
通道是协程之间的数据传输通道。通道可以在众多的协程之间传递数据,
具体可以值也可以是个引用。通道有两种使用方式。
· 协程可以试图向通道放入数据,如果通道满了,会挂起协程,
直到通道可以为他放入数据为止。
· 协程可以试图向通道索取数据,如果通道没有数据,会挂起协程,
直到通道返回数据为止。
使用
package main import "fmt" func Add(ch chan int, x, y int) { z := x + y // 往channel中写数据 ch <- z } func main() { // 定义10个channel chs := make([]chan int, 10) for i := 0; i < 10; i++ { chs[i] = make(chan int) // 使用goroutine go Add(chs[i], i, 1) } for i, ch := range chs { fmt.Println("chan index", i) // 读channel中的数据 value := <-ch fmt.Println("value", value) } }
总结
- Golang的并发模型是基于消息来共享内存,这种模型的好处就是程序员可以控制并发。
参考
MySQL统计
按日期统计
代码:
-- 按年统计 SELECT YEAR(`date_field`), COUNT(*) AS `total` FROM `table` GROUP BY YEAR(`date_field`) -- 按年月统计 SELECT YEAR(`date_field`), MONTH(`date_field`), COUNT(*) AS `total` FROM `table` GROUP BY YEAR(`date_field`), MONTH(`date_field`) -- 按年月日统计 SELECT YEAR(`date_field`), MONTH(`date_filed`), COUNT(*) AS `total` FROM `table` GROUP BY YEAR(`date_field`), MONTH(`date_field`), DAY(`date_field`)
一个字段不同的统计条件
使用 CASE 关键字
代码:
/* 我需要按月统计完成的订单中客户给5星评价和给4星评价的数目*/ SELECT YEAR(`finishtime`), MONTH(`finishtime`), (CASE WHEN `rate`=5 THEN 1 ELSE NULL END), (CASE WHEN `rate`=4 THEN 1 ELSE NULL END), FROM `order` GROUP BY YEAR(`finishtime`), MONTH(`finishtime`)
杂项
为什么使用 ` `
为了区别SQL关键字和数据库的字段。
为什么不用IS NULL 和 IS NOT NULL来过滤数据
使用IS NULL 或这IS NOT NULL 无法命中索引,导致效率问题,
可以使用 `field`>'' 或者 `field`>0替换上述情况。
SQL 规范
SQL 的关键字都用大写。
SQL注释
-- 是单行注释 /*多行注释*/
MySQL 时间戳函数
UNIX_TIMESTAMP(datetime) FROM_UNIXTIME(unixtime)
- 最后更新
octopress+org-mode写博客
- 主要内容
- 安装octopress
- 什么是octopress
- 基本安装
- 配置
- 使用org-mode写博客
- 什么是org-mode
- 安装emacs24
- 使用高手配置
- 配置org-mode来写博客
- 总结
- 安装octopress
- 打开emacs
- M-x org-octopress
- Compose YYYY-MM-DD-title.org in source/blog directory.
- C-c C-e (org-export-dispatch) and type “P” “x” “octopress”
- In command line terminal:
1 安装octopress
什么是octopress
octopress 是一个静态blog,使用markdown语言来写文章,可以部署在github page上,
有非常漂亮的代码高亮插件,blog for hacker是他的哲学,简单、实用、COOL.
配置:
评论配置使用 Disqus, 需要到 http://disqus.com/admin/signup/?utm_source=new-site 注册,
注册完成后需要到admin的settings里添加相应的sitename和siteurl.
然后修改 octopress里的 _config.yaml文件
#disqus comments disqus_short_name: your disqus name disqus_show_comment_count: true
配置成功后,运行
rake generic rake preview # 在浏览器中输入127.0.0.1:4000预览
预览没有问题就可以使用:
rake deploy #上传到github page,在浏览器输入相应的地址便可以查看,可能会有所延时
2. 使用org-mode来写博客
什么是org-mode
org-mode 的哲学是organize your life in plaintext,是emacs中的一个模式,
你可以用它做gtd 、todo、project plan 、文学编程,类似wytwyg(所想即所得),
可以将文章导出为html、pdf等文件,还可以与版本控制结合起来,在emacs下可以
有很多hack的功能。
安装emacs24
mac使用brew可以直接安装:
brew install emacs
配置emacs
直接使用大师purcell的配置https://github.com/purcell/emacs.d
按照上面的教程完成基本配置之后,需要到 ~/.emacs.d/lisp/ 下建立 init-local.el,
touch ~/.emacs.d/lisp/init-local.el
自己的配置都写到这个文件里。
配置使用org-mode 来写octopress
插件地址 有详细文档
打开emacs,按 M-x 输入命令 desktop-clear 清除emacs的sessions ,
按 m-x 输入 package-list-packages 然后enter,
通过C-s查找org和org-octopress, 紧接着用i标记安装,然后按x执行安装。
安装结束后重启emacs, 在init-local.el输入以下配置。
;;; org mode ;;; 打开后缀名为org的文件时自动启用org mode (add-to-list 'auto-mode-alist '("\\.org\\'" . org-mode)) (global-font-lock-mode 1) ;;; org octopress ;;; 注意将optopress路径需要替换成你的optopress路径 (require 'org-octopress) (setq org-octopress-directory-top "~/CodeRepo/GitRepo/octopress/source/org_pos/source") (setq org-octopress-directory-posts "~/CodeRepo/GitRepo/octopress/source/_posts") (setq org-octopress-directory-org-top "~/CodeRepo/GitRepo/octopress/source") (setq org-octopress-directory-org-posts "~/CodeRepo/GitRepo/octopress/source/blog") ;;; 需要拷贝https:////github.com/yoshinari-nomura/org-octopress 的setupfile-sample.org 到下面的目录 ;;; 并且需要更换名字 (setq org-octopress-setup-file "~/CodeRepo/GitRepo/octopress/org-sty/setupfile.org") (provide 'init-local)
修改 octopress 中的_config.yaml
# 修改permalink 为如下 permalink: /blog/:year-:month-:day-:title.html
使用
rake preview
总结
为什么我要使用emacs
VIM 我已经使用的很熟练了,但是它始终是编辑器之神,也就是编辑代码
快一些而已, 除此之外在它上面已经找不到让人兴奋的感觉了, 而emacs的
哲学是神的编辑器, 对于我来说它是一个操作系统, 你可以控制一切你想控制
的东西, 可以使用elisp在上面hack, 让你更多的去思考, 而不仅仅是编辑。
octopress + emacs的org mode
这个模式是我在使用emacs中想出来的, 事实也证明了在emacs的世界里, 没有
做不到的, 只有你想不到的, 以后我会通过这个模式记录学习的点点滴滴, 管理
好自己的知识, 用emacs去做一些cool的事情。
开始octopress博客旅程
我们开始吧
1 部署
2 使用
部署有三种方式, 我使用的是部署在github上的
准备:
1 安装git, 并且要有git帐号, 教程
2 安装ruby, 上面教程写得很详细。
3 部署博客。
####使用:
参考的是这篇文章, 官方的文档也讲得挺好
一些有用的资源:
markdown 语法