9月 12

golang 批量检查页面

  在学习go语言,所以当前的需求使用go来试验一下。需要:循环检查某些url并返值,并获取所用时间,如果返回内容长度超过100个字节,只显示前100个字节,不足100个字节显示全部。我将url写在url.txt文件中,方便以后增加。
  在centos 5.4下go1.0.2编译通过。虽然编译通过,但是个人感觉还是不如python方便,并且变异出来的东西都快3M了,让我想起了当年的delphi。如果这种监测实验脚本还是首选python。但是用python做有个问题,如果使用“while 1”循环使用urllib2获取,时间一长就失败过多。具体原因没有查,直接用crontab或脚本调用解决。

package main

import ("fmt"
        "os"
        "net/http"
        "io/ioutil"
        "time"
        )

func main() {
        var str string
        userFile := "url.txt"
        fin,err := os.Open(userFile)
        defer fin.Close()
        if err != nil {
                fmt.Println(userFile,err)
                return
        }
        buf := make([]byte, 1)
        //
        for{
            n,_:= fin.Read(buf)
            if 0==n {break}
            if string(buf)=="\n"{
               //开始通过url获得页面
               starttime:=time.Now().Unix()
               res, err := http.Get(str)
               endtime:=time.Now().Unix()
               usetime:=endtime-starttime
               if err != nil {
                   fmt.Println(err)
               } 
               context, err := ioutil.ReadAll(res.Body)
               if err != nil {
                   fmt.Println(err)
               }
               res.Body.Close()
               // 获得完毕打印
               if len(context) >100{
                     fmt.Println(string(context)[:100])
               } else {
                     fmt.Println(string(context))
               }
               fmt.Println("get url:", str, " use time :", usetime)
               str=""
            } else {
                str+=string(buf)
              }
        }
}
8月 16

go 操作redis ,对比python 操作redis

  之前做过python入库到redis的测试 http://www.simonzhang.net/?p=430
  今天才发现由于页面生成问题,有部分代码被转译了。借这个机会在同一台机器上再测试一下这两种语言。

  测试服务器为一个Xeon(TM)双核3.20GHz 的cpu,内存4G。操作系统为Centos5.4 64位。go1.0.2,python2.6

  go环境和redis之前已经有记录,go语言的redis开发包安装也比较简单,但是官方文档中目录有写错。
  我的go放在/usr/local/go,我的安装记录如下:
cd /usr/local/go/src/pkg
git clone git://github.com/alphazero/Go-Redis.git redis
cd redis
go install

仍旧用大密码表实验,go语言代码如下:

//www.simonzhang.net
package main 

import (
	"os";
	"log";
	"fmt";
	"redis";
        "encoding/hex"
        "crypto/md5"
)

func main () {
	spec := redis.DefaultSpec().Db(1).Password("");
        //如要操作远程redis服务器连接如下
	//spec := redis.DefaultSpec().Host("192.168.1.200").Db(1).Password("123");
	client, e := redis.NewSynchClientWithSpec (spec);
	if e != nil { log.Println ("failed to create the client", e); return }
        var str string
        userFile := "big_pass.txt"
        fin,err := os.Open(userFile)
        defer fin.Close()
        if err != nil {
                fmt.Println(userFile,err)
                return
        }
        buf := make([]byte, 1)
        for{
                n,_:= fin.Read(buf)
                if 0==n {break}
                if string(buf)=="\n"{
	            h:= md5.New()
   	            h.Write([]byte(str))
                    key:=hex.EncodeToString(h.Sum(nil));
                    value:=[]byte(str)
                    client.Set(key, value);
                    str=""
                 }else{
                    str+=string(buf)
                 }
                  
        }
}

开始测试

go使用build编译运行,cpu使用率在55%左右,load average: 1.98, 1.22, 0.91
real 1m33.310s
user 0m42.586s
sys 0m34.567s

python cpu使用在在80%,load average: 2.19, 1.36, 0.86。
real 1m26.873s
user 0m56.316s
sys 0m19.595s

  总结python写redis的东西比较简单。go对字符串做了MD5,入redis时用MD5值做key。
a)都运行完毕python和go录入redis行数与文本行数相同。
b)从大小来看python不到1K,go编译完成2.3M。如果要一处编译,移到其他服务器运行,go编译完的可以直接运行,python还要再装环境。但是有easy_install,所以装环境对我来说比较简单。
c) cpu使用量来看go要比python好一些,在增加md5计算的情况下所用系统资源也比pyhton少,但是应该快不了一倍。
d) 从代码编写的逻辑和难易程度来看,还是python简单一点。
如果要考虑速度可以试试Cpython,我没有试过。