Django: создание фонового процесса с использованием os.fork? - PullRequest
2 голосов
/ 11 августа 2011

Я хочу запустить долгосрочный скрипт в фоновом режиме после получения запроса. Я прочитал о 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 ]

4 голосов
/ 11 августа 2011

Да, не делайте этого, используйте сельдерей .Это делает выполнение асинхронных задач намного проще и надежнее.

1 голос
/ 11 августа 2011

Если вы не хотите использовать асинхронные очереди задач с чем-то вроде сельдерея, вы всегда можете просто запустить скрипт python через cron.Есть несколько вариантов сделать это.Пример:

  • создать модель, в которой будут сохранены значения, необходимые для вашего процесса
  • написать автономный скрипт python / django, который получает значения из модели, выполнить задачу иудалить записи базы данных
  • настроить cronjob для запуска вашего скрипта
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...