在一个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()