django中优雅的启动额外的socket连接

在一个django项目中需要使用的socket连接持续获取额外的一些数据,还需要用到apscheduelr控制定时任务
看到一些文章是直接把apscheduler的启动、socket的创建都放在urls.py里面
一开始我也这样做,但是后面每次执行python manage.py ....命令时,都会执行urls.py中添加的scheduler/socket,

看来这种方式很不优雅,自己不懂django启动时内部的运行机制, 所以不知道怎么修改这种启动方式
最后, 在django 项目启动之后,通过外部http请求,让djagno 服务本身去启动 scheduler、socket,
这个http请求可以使用 django custom command 去实现

 

django-socket-command.png

下面直接通过接口实现

router.register("service",ServiceViewSet,base_name="service")
from utils.schedu import scheduler,tick,tick111
class ServiceViewSet(mixins.ListModelMixin,viewsets.GenericViewSet):
    queryset = Honor.objects.all()
    serializer_class = HonorSerializer

    def list(self, request, *args, **kwargs):
        print(scheduler.running)
        if not scheduler.running:
            # 未显式指定,那么则立即执行
            # scheduler.add_job(tick,)
            scheduler.add_job(tick, 'cron', second='*/10', hour='*')
            now = datetime.datetime.now()
            print(now)
            five_second = now + datetime.timedelta(seconds=5)
            five_second = five_second.strftime("%Y-%m-%d %H:%M:%S")
            print(five_second)

            scheduler.add_job(tick111, 'date', run_date=five_second)
            try:
                scheduler.start()
                scheduler.shutdown()
            except (KeyboardInterrupt,SystemExit):
                scheduler.shutdown()
            return Response("success")
        else:

            return Response("fail")

 

 

vim utils.schedu.py

from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime,timedelta
from kfsd.consumers import message_dict

def tick():
    for k,v in message_dict.items():
        print(k,v)
    print('this is task ,the time is %s'%datetime.now())
def tick111():
    from utils.server import server
    print('-------------------time is %s' % datetime.now().strftime("%Y-%m-%d"))
    print('service  start')
    server()
    print('-------------------time is %s'%datetime.now().strftime("%Y-%m-%d"))

def schedu(tasks):
    scheduler = BlockingScheduler()
    scheduler.add_job(tasks, 'cron', second='*/3', hour='*')
    print('start')
    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        scheduler.shutdown()

scheduler = BlockingScheduler()

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值