0x00 想法

最近一直在了解一些机器学习相关的算法,但是看了很多以后发现还是数理基础很重要,所以在艰难的看数学(好在底子还行,虽然现在看会头晕~)。关于数据分析中微博数据的采集,我构想是能够组成一个分布式的爬虫。所以最近也在看一些分布式架构相关的东西,但是还是没有总结出来一个可行的方案,但是太久不更新又怕我弃坑,所以把最近看到的两种想法分享出来。

0x01 理想架构

其实理想中的架构类似于两部分。

  • 调度任务
  • 爬取任务

有一个master节点负责调度,负责给爬虫节点分发任务。而爬虫节点则需要一边监听master节点的任务,一边处理master节点分发的任务。不过我遇到了如下几个问题:

  • 爬虫节点如何一边监听任务一边使用协程。当然,这用go是很好实现的,但是用python就有点问题,目前还没有找到调度的方式。
  • 爬虫节点如何向master节点汇报自己的当前状态,例如协程数量,是否能接受任务,目前的任务队列,以及任务完成情况等。

目前遇到的情况就是如此。

0x02 两种调度的写法。

  • Python

import time
import asyncio

class testxiecheng:

    def __init__(self):
        self.taskCount = 0
        self.finishCount = 0

    async def test1(self):

        print("test1 start time at: "+str(time.time()))
        await asyncio.sleep(2)
        self.finishCount += 1
        print("test1 finish time at: " + str(time.time()))

    async def test2(self):
        print("test2 start time at: " + str(time.time()))
        # print(time.time())
        await asyncio.sleep(3)
        self.finishCount += 1
        print("test2 finish time at: " + str(time.time()))

    async def addtest(self,loop):

        loop.create_task(self.test1())
        loop.create_task(self.test2())
        self.taskCount = 2

        while self.taskCount != self.finishCount:
            await asyncio.sleep(1)

        print("all finish time: " + str(time.time()))

    def main(self):

        print("start all time at: " + str(time.time()))
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.addtest(loop))




if __name__ == "__main__":
    a = testxiecheng()
    a.main()

这种是参考 9ianli 师父的case,相当于,以协程调用协程。实现了一种类似于线程池的概念。但是弊端就在于他的调度程序和处理的程序在一个进程中,可能会造成性能损失?

  • Golang
package main

import (
    "fmt"
    "time"
)


func Count(ch chan int,flag int){
    fmt.Println(flag,"start",time.Now())
    time.Sleep(2*time.Second)
    <-ch
    fmt.Println(flag,"finish",time.Now())
}


func main(){
    flag := 0
    chs := make(chan int,10)
    for true{
        chs <- 1
        go Count(chs,flag)
        flag += 1
    }

}

通过为一个channel 设置缓冲区,然后不断的往里面添加任务。不过我对golang的了解没特别深,而且golang如果写爬虫可能没有python的库支持那么好,目前还在学习中。

0x03 一点随想

golang真的是一门很棒的语言,并发写起来得心应手,而且和C的感觉很类似。

看算法以后真的觉的数学基础很重要,属于特别重要的那种,所以还在学习。很多书籍都只是说了如何应用,却没有说模型如何建立,个人觉的这样不好,不了解根本很多东西根本体会不到其中的妙用。

这个系列会一直更新,可能目前还是爬虫为主,但是会增加一个机器学习的系列,也想搞个微信公众号,可是群里的老哥不够给力,目前作罢。