django:使用os.fork创建后台进程?

2 投票
2 回答
2060 浏览
提问于 2025-04-16 23:21

我想在收到请求后,让一个长时间运行的脚本在后台执行。我看到有人提到过 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')

我按照另一个帖子的建议使用了 os.fork,但似乎控制权没有进入我的 if pid == 0 部分。这是正确的方法吗?

2 个回答

1

如果你不想使用像celery这样的异步任务队列,你可以选择通过cron来运行一个python脚本。这样做有几种方法。下面是一个例子:

  • 创建一个模型,用来保存你处理过程中需要的值。
  • 写一个独立的python/django脚本,从模型中获取这些值,执行任务,然后删除数据库中的记录。
  • 设置一个cron任务来定期运行你的脚本。
5

嗯,别这样做,还是用celery吧。它能让你运行异步任务变得简单多了,而且更可靠。

撰写回答