这样做django的后台运行程序是否可以?

2013-01-22 12:13:26 +08:00
 rockhead
现有一个django app; 想要增加一个爬虫定期更新数据,这个爬虫显然是长时间运行的;

所以我想:
1 给app 增加一个django custom command
2 后台执行该命令: nohup python manage.py mycmd &

这样做是否可行?
10763 次点击
所在节点    Django
11 条回复
7gong
2013-01-22 13:02:03 +08:00
用 curl 定时出发某个 Post 或 get 页面就是了
adieu
2013-01-22 13:06:21 +08:00
可以试试看用 celery http://celeryproject.org/ 来做。定期执行和接受webapp下发的task都可以实现。
rockhead
2013-01-22 13:14:38 +08:00
@adieu 谢谢 但感觉celery有点牛刀小用了;我这个是个小app,希望尽可能简单
ratazzi
2013-01-22 13:21:22 +08:00
开个线程跑也是一个办法,如果要后台以命令方式运行的话还是建议用 supervisor,不要用 nohup
Js
2013-01-22 14:10:09 +08:00
轻量级的daemon其实可以这样实现

import os, ctypes
import ctypes.util

ctypes.CDLL(ctypes.util.find_library('c')).daemon(0,0)

open('/var/run/demo.pid','w').write(str(os.getpid()))
rockhead
2013-01-22 15:51:59 +08:00
@Js 这段代码没看懂 可否解释下?
BigZ
2013-01-23 18:52:00 +08:00
你是想用django的 orm部分吧,把这段加到你的py文件头部,文件可以单独执行

import sys, os

PROJECT_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(PROJECT_DIR)

from django.core.management import setup_environ
import settings
setup_environ(settings)
Js
2013-01-25 14:35:31 +08:00
@rockhead
nohup是忽略了SIGHUP信号, 重定向stdout,stderr实现一个模拟守护进程
这个是用ctypes调用glibc的daemon函数, 直接实现了守护进程
freefcw
2013-01-25 14:50:23 +08:00
@Js omg……你这写法太牛逼了,要我就会直接开个screen,在里面跑python daemon.py
mitnk
2013-01-25 14:53:03 +08:00
rockhead
2013-01-26 08:19:20 +08:00
谢谢各位 我实践一下

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/58381

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX