|
@@ -0,0 +1,242 @@
|
|
|
+package timetask
|
|
|
+
|
|
|
+import (
|
|
|
+ qu "qfw/util"
|
|
|
+ "sync"
|
|
|
+ "time"
|
|
|
+ "util"
|
|
|
+)
|
|
|
+
|
|
|
+type SiteInfo struct {
|
|
|
+ Lasttime int64
|
|
|
+ DownloadNum int
|
|
|
+}
|
|
|
+
|
|
|
+var siteMap map[string]*SiteInfo
|
|
|
+
|
|
|
+func UpdateSiteInfo() {
|
|
|
+ qu.Debug("开始更新站点最新数据...")
|
|
|
+ siteMap = map[string]*SiteInfo{}
|
|
|
+ GetSite() //获取现有站点信息
|
|
|
+ GetSiteLasttime() //更新最新发布数据日期
|
|
|
+ GetSiteDownloadNum() //更新前一天数据发布量
|
|
|
+ UpdateSite() //更新信息
|
|
|
+ siteMap = map[string]*SiteInfo{}
|
|
|
+ qu.Debug("更新站点最新数据结束...")
|
|
|
+}
|
|
|
+func GetSite() {
|
|
|
+ defer qu.Catch()
|
|
|
+ sess := util.MgoEB.GetMgoConn()
|
|
|
+ defer util.MgoEB.DestoryMongoConn(sess)
|
|
|
+ ch := make(chan bool, 5)
|
|
|
+ wg := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ fields := map[string]interface{}{
|
|
|
+ "site": 1,
|
|
|
+ "lasttime": 1,
|
|
|
+ }
|
|
|
+ it := sess.DB(util.MgoEB.DbName).C("site").Find(nil).Select(&fields).Iter()
|
|
|
+ n := 0
|
|
|
+ for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
|
|
|
+ ch <- true
|
|
|
+ wg.Add(1)
|
|
|
+ go func(tmp map[string]interface{}) {
|
|
|
+ defer func() {
|
|
|
+ <-ch
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ site := qu.ObjToString(tmp["site"])
|
|
|
+ lasttime := qu.Int64All(tmp["lasttime"])
|
|
|
+ lock.Lock()
|
|
|
+ siteMap[site] = &SiteInfo{
|
|
|
+ Lasttime: lasttime,
|
|
|
+ DownloadNum: 0,
|
|
|
+ }
|
|
|
+ lock.Unlock()
|
|
|
+ }(tmp)
|
|
|
+ if n%1000 == 0 {
|
|
|
+ qu.Debug("current:", n)
|
|
|
+ }
|
|
|
+ tmp = map[string]interface{}{}
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+}
|
|
|
+
|
|
|
+func GetSiteLasttime() {
|
|
|
+ GetLuaSiteLasttime()
|
|
|
+ GetPythonSiteLasttime()
|
|
|
+}
|
|
|
+
|
|
|
+func GetLuaSiteLasttime() {
|
|
|
+ defer qu.Catch()
|
|
|
+ sess := util.MgoS.GetMgoConn()
|
|
|
+ defer util.MgoS.DestoryMongoConn(sess)
|
|
|
+ ch := make(chan bool, 5)
|
|
|
+ wg := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ query := map[string]interface{}{
|
|
|
+ "comeintime": map[string]interface{}{
|
|
|
+ "$gte": util.GetTime(-1),
|
|
|
+ "$lte": time.Now().Unix(),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ fields := map[string]interface{}{
|
|
|
+ "site": 1,
|
|
|
+ "publishtime": 1,
|
|
|
+ }
|
|
|
+ it := sess.DB(util.MgoS.DbName).C("data_bak").Find(&query).Select(&fields).Iter()
|
|
|
+ n := 0
|
|
|
+ for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
|
|
|
+ ch <- true
|
|
|
+ wg.Add(1)
|
|
|
+ go func(tmp map[string]interface{}) {
|
|
|
+ defer func() {
|
|
|
+ <-ch
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ site := qu.ObjToString(tmp["site"])
|
|
|
+ publishtime := qu.Int64All(tmp["publishtime"])
|
|
|
+ lock.Lock()
|
|
|
+ if sInfo := siteMap[site]; sInfo != nil {
|
|
|
+ if sInfo.Lasttime < publishtime && publishtime > 1000000000 {
|
|
|
+ sInfo.Lasttime = publishtime
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ qu.Debug("站点信息不存在:", site)
|
|
|
+ }
|
|
|
+ lock.Unlock()
|
|
|
+ }(tmp)
|
|
|
+ if n%1000 == 0 {
|
|
|
+ qu.Debug("current:", n)
|
|
|
+ }
|
|
|
+ tmp = map[string]interface{}{}
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+}
|
|
|
+
|
|
|
+func GetPythonSiteLasttime() {
|
|
|
+ defer qu.Catch()
|
|
|
+ sess := util.MgoS.GetMgoConn()
|
|
|
+ defer util.MgoS.DestoryMongoConn(sess)
|
|
|
+ ch := make(chan bool, 5)
|
|
|
+ wg := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ query := map[string]interface{}{
|
|
|
+ "comeintime": map[string]interface{}{
|
|
|
+ "$gte": util.GetTime(-1),
|
|
|
+ "$lte": time.Now().Unix(),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ fields := map[string]interface{}{
|
|
|
+ "site": 1,
|
|
|
+ "l_np_publishtime": 1,
|
|
|
+ }
|
|
|
+ it := sess.DB(util.MgoPy.DbName).C("data_bak").Find(&query).Select(&fields).Iter()
|
|
|
+ n := 0
|
|
|
+ for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
|
|
|
+ ch <- true
|
|
|
+ wg.Add(1)
|
|
|
+ go func(tmp map[string]interface{}) {
|
|
|
+ defer func() {
|
|
|
+ <-ch
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ site := qu.ObjToString(tmp["site"])
|
|
|
+ publishtime := qu.Int64All(tmp["l_np_publishtime"])
|
|
|
+ lock.Lock()
|
|
|
+ if sInfo := siteMap[site]; sInfo != nil {
|
|
|
+ if sInfo.Lasttime < publishtime && publishtime > 1000000000 {
|
|
|
+ sInfo.Lasttime = publishtime
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ qu.Debug("站点信息不存在:", site)
|
|
|
+ }
|
|
|
+ lock.Unlock()
|
|
|
+ }(tmp)
|
|
|
+ if n%1000 == 0 {
|
|
|
+ qu.Debug("current:", n)
|
|
|
+ }
|
|
|
+ tmp = map[string]interface{}{}
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+}
|
|
|
+
|
|
|
+func GetSiteDownloadNum() {
|
|
|
+ defer qu.Catch()
|
|
|
+ sess := util.MgoEB.GetMgoConn()
|
|
|
+ defer util.MgoEB.DestoryMongoConn(sess)
|
|
|
+ ch := make(chan bool, 5)
|
|
|
+ wg := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ query := map[string]interface{}{
|
|
|
+ "comeintime": map[string]interface{}{
|
|
|
+ "$gte": util.GetTime(0),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ fields := map[string]interface{}{
|
|
|
+ "site": 1,
|
|
|
+ "repeatptimeallnum": 1,
|
|
|
+ }
|
|
|
+ it := sess.DB(util.MgoEB.DbName).C("luacodeinfo").Find(&query).Select(&fields).Iter()
|
|
|
+ n := 0
|
|
|
+ for tmp := make(map[string]interface{}); it.Next(tmp); n++ {
|
|
|
+ ch <- true
|
|
|
+ wg.Add(1)
|
|
|
+ go func(tmp map[string]interface{}) {
|
|
|
+ defer func() {
|
|
|
+ <-ch
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ site := qu.ObjToString(tmp["site"])
|
|
|
+ num := qu.IntAll(tmp["repeatptimeallnum"])
|
|
|
+ lock.Lock()
|
|
|
+ if sInfo := siteMap[site]; sInfo != nil {
|
|
|
+ sInfo.DownloadNum += num
|
|
|
+ } else {
|
|
|
+ qu.Debug("站点信息不存在:", site)
|
|
|
+ }
|
|
|
+ lock.Unlock()
|
|
|
+ }(tmp)
|
|
|
+ if n%1000 == 0 {
|
|
|
+ qu.Debug("current:", n)
|
|
|
+ }
|
|
|
+ tmp = map[string]interface{}{}
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+}
|
|
|
+
|
|
|
+func UpdateSite() {
|
|
|
+ ch := make(chan bool, 5)
|
|
|
+ wg := &sync.WaitGroup{}
|
|
|
+ lock := &sync.Mutex{}
|
|
|
+ arr := [][]map[string]interface{}{}
|
|
|
+ for site, sInfo := range siteMap {
|
|
|
+ ch <- true
|
|
|
+ wg.Add(1)
|
|
|
+ go func(s string, sInfo *SiteInfo) {
|
|
|
+ defer func() {
|
|
|
+ <-ch
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ update := []map[string]interface{}{
|
|
|
+ {"site": s},
|
|
|
+ {"$set": map[string]interface{}{
|
|
|
+ "lasttime": sInfo.Lasttime,
|
|
|
+ "site_datanum": sInfo.DownloadNum,
|
|
|
+ }},
|
|
|
+ }
|
|
|
+ lock.Lock()
|
|
|
+ arr = append(arr, update)
|
|
|
+ if len(arr) > 500 {
|
|
|
+ util.MgoEB.UpdateBulk("site", arr...)
|
|
|
+ arr = [][]map[string]interface{}{}
|
|
|
+ }
|
|
|
+ lock.Unlock()
|
|
|
+ }(site, sInfo)
|
|
|
+ }
|
|
|
+ wg.Wait()
|
|
|
+ if len(arr) > 0 {
|
|
|
+ util.MgoEB.UpdateBulk("site", arr...)
|
|
|
+ arr = [][]map[string]interface{}{}
|
|
|
+ }
|
|
|
+}
|