我希望在收到请求后在后台运行一个长时间运行的脚本。我读到了subprocess
,但我要求呼叫是非阻塞的,以便请求能够及时完成。
def controlCrawlers(request):
if request.method == 'POST' and 'type' in request.POST and 'cc' in request.POST:
if request.POST['type'] == '3':
if request.POST['cc'] == '1':
try: #temp solution checking socket is occupied by trying to connect
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost',DISCOVERY_SOCKET))
s.close()
return HttpResponse(simplejson.dumps({'success':0,'message': 'Socket is occupied. Possible crawler is already running'}), \
mimetype='application/json')
except:
pid = os.fork()
if pid == 0:
#f = open('/home/foo/django','a')
#f.write('abc')
# f.close()
path = os.path.join(os.path.dirname(__file__), 'blogcontentReader/blogpost_crawler.py')
os.system("python %s" %path)
os._exit(0)
return HttpResponse(simplejson.dumps({'success':1,'message': 'Running...'}), \
mimetype='application/json')
我使用了另一个post建议的os.fork,但显然控件不会流入我的if pid == 0
部分。这是正确的方法吗?
答案 0 :(得分:4)
是的,不要这样做,请改用celery。它使运行异步任务变得更容易,更可靠。
答案 1 :(得分:1)
如果您不想使用像celery这样的异步任务队列,您可以随时通过cron运行python脚本。有几种方法可以做到这一点。一个例子: