Runforever

to be a rock star


  • 首页

  • 归档

  • 标签

go语言并发模型

发表于 2014-04-25 | 分类于 Go | | 阅读次数:

GO 语言并发模型

哲学

不要通过共享内存来通信, 应该通过通信来共享内存

进程、线程、协程

进程

  1. 操作系统中最核心的概念是进程。
  2. 进程是“程序执行的一个实例” ,担当分配系统资源的实体。
  3. 进程创建必须分配一个完整的独立地址空间。
  4. 让计算机能够同时处理多个任务,操作系统有了进程的概念, 而且在进程内部,基本可以认为当前系统只有一个进程在运行, 操作系统对此作了非常好的封装。进程间的切换是有操作系统来完成的。

线程

线程是进程的一个执行流,独立执行它自己的程序代码。 线程是操作系统能够进行运算调度的最小单位。

线程的问题是:
1)存在线程安全问题,出了问题非常不易定位。
2)进程内部有线程数目的限制。
3)随着并发量的增加,线程生成和切换的成本也变得昂贵。

协程

  1. 协程不同于线程的地方在于协程不是操作系统进行切换, 而是由程序员编码进行切换的,也就是说切换是由程序员控制的, 这样就没有了线程所谓的安全问题。
  2. 所有的协程都共享整个进程的上下文,这样协程间的交换也非 常方便。

缺点:协程的缺点可能是无法利用多核优势。

简而言之:编程语言提供的一种并发机制,不受操作系统的调度,由 程序员来控制。

并发编程难度

并发编程的难度在于协调,而协调就要通过通信。
并发通信模型: 共享数据和消息。

基于内存的消息通信缺点:
我们还能用多线程干活,只是因为我们手里还有加锁机制,
而它可以部分地堵上线程模型的漏洞。讽刺的是,
引入加锁机制解决问题的同时,又带来了新的问题,
所以我们编写多线程程序总会遇上死锁,活锁,优先级反转……等等。

基于消息共享内存的优点:

  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的并发模型是基于消息来共享内存,这种模型的好处就是程序员可以控制并发。

参考

http://www.cnblogs.com/shenguanpu/archive/2013/05/05/3060616.html
http://www.cnblogs.com/chgaowei/archive/2012/06/21/2557175.html
《Go语言编程》 许式伟 吕桂华
http://qing.blog.sina.com.cn/tj/88ca09aa33002ele.html

阅读全文 »

MySQL统计

发表于 2014-04-20 | 分类于 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)
  • 最后更新[2014-04-20 日 20:24]

    阅读全文 »

octopress+org-mode写博客

发表于 2014-04-19 | 分类于 Emacs , Org | | 阅读次数:
  • 主要内容
    1. 安装octopress
      • 什么是octopress
      • 基本安装
      • 配置
    2. 使用org-mode写博客
      • 什么是org-mode
      • 安装emacs24
      • 使用高手配置
      • 配置org-mode来写博客
    3. 总结
  • 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
    

    使用

    1. 打开emacs
    2. M-x org-octopress
    3. Compose YYYY-MM-DD-title.org in source/blog directory.
    4. C-c C-e (org-export-dispatch) and type “P” “x” “octopress”
    5. In command line terminal:

    rake preview

    总结

    为什么我要使用emacs

    VIM 我已经使用的很熟练了,但是它始终是编辑器之神,也就是编辑代码
    快一些而已, 除此之外在它上面已经找不到让人兴奋的感觉了, 而emacs的
    哲学是神的编辑器, 对于我来说它是一个操作系统, 你可以控制一切你想控制
    的东西, 可以使用elisp在上面hack, 让你更多的去思考, 而不仅仅是编辑。

    octopress + emacs的org mode

    这个模式是我在使用emacs中想出来的, 事实也证明了在emacs的世界里, 没有
    做不到的, 只有你想不到的, 以后我会通过这个模式记录学习的点点滴滴, 管理
    好自己的知识, 用emacs去做一些cool的事情。

    阅读全文 »

开始octopress博客旅程

发表于 2011-11-27 | 分类于 tutorial , life | | 阅读次数:

我们开始吧
1 部署
2 使用

####部署
我主要参考了官方的文章
和这里

部署有三种方式, 我使用的是部署在github上的
准备:
1 安装git, 并且要有git帐号, 教程
2 安装ruby, 上面教程写得很详细。
3 部署博客。

####使用:
参考的是这篇文章, 官方的文档也讲得挺好

一些有用的资源:
markdown 语法

1…34
runforever

runforever

K.I.S.S

34 日志
30 分类
RSS
GitHub Bitbucket Issue
© 2020 runforever
由 Hexo 强力驱动
|
主题 — NexT.Gemini
蜀ICP备16025642号-2