通过Redis队列,实现python和Go之间通信,go处理django异步任务

go语言写web感觉还是没有django写web那么得心应手,不过利用go的goroute做一些小组件还是很不错的,列如发送邮件。

列如django如果需要执行异步任务的话,可以将任务存入Redis队列,然后通过Go写的程序从Redis队列中取出任务,异步执行。列如发送邮件

通过Redis队列,实现python和Go之间通信,go处理django异步任务

做了下简单测试,以下代码是能够实现通信的:

python端生成任务:

import redis,json
pool=redis.ConnectionPool(host='127.0.0.1',port=6379,db=0)
r = redis.StrictRedis(connection_pool=pool)
msg={}
msg["to"]="xxxx@qq.com"
msg['subject']="hello msg from redis"
msg['body']="body msg from redis"
print(r.lpush('email', msg))
print(r.llen('email'))
# print(r.brpop('email',0))
# print(r.llen('email'))

Go端消费任务:

package main
import (
 "fmt"
 "github.com/astaxie/beego/logs"
 "github.com/garyburd/redigo/redis"
 "time"
)
var RedisPool *redis.Pool
var conn redis.Conn
func initRedis() (err error) {
 RedisPool = &redis.Pool{
 MaxIdle: 8,
 MaxActive: 64,
 IdleTimeout: 300 * time.Second,
 Dial: func() (redis.Conn, error) {
 return redis.Dial("tcp", "127.0.0.1:6379")
 },
 }
 conn = RedisPool.Get()
 //defer conn.Close()
 _, err = conn.Do("ping")
 if err != nil {
 logs.Error("ping redis failed, err:%v", err)
 return
 }
 return
}
func main() {
 initRedis()
 defer conn.Close()
 for {
 reply, _ := conn.Do("LPOP", "email")
 if reply != nil {
 fmt.Println(string(reply.([]byte)))
 }else{
 time.Sleep(time.Second * 2)
 fmt.Println("wait 2 seconds")
 }
 }
}

效果图:

00:00

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
七七八八的头像 - 宋马
评论 共1条

请登录后发表评论