2011-08-11 2 views
2

요청을 받으면 백그라운드에서 장기 실행 스크립트를 실행하고 싶습니다. subprocess에 대해 읽었지만 요청이 시간 내에 완료 될 수 있도록 호출이 비 차단이어야합니다. 다른 post에서 제안하지만 분명히 내 if pid == 0 부분으로 흐르지 않고 제어로django : os.fork를 사용하여 백그라운드 프로세스 만들기?

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를 사용했다. 이 작업을 수행하는 올바른 방법입니까?

+0

가'보십시오 스크립트를 실행 cronjob에를 설정 한 경우 request.method == 'POST'와 request.POST.get ('유형') == '3'과 request.POST.get ('CC ') =='1 ':'두 개의 들여 쓰기 레벨을 저장하십시오. 또한,'try'로 돌아 오기 때문에,'except : pass'를하고 그 내용을 들여 쓰기 레벨 밖으로 옮기십시오. 모든 것을 더 읽기 쉽게 만듭니다. – agf

+0

'subprocess.Popen'이 작동하지 않는 이유를 모르겠습니다. 실행이 계속되는 것을 멈추지 않습니까? – agf

+0

@agf, yea, 내 게시물의 링크에서 보는 것부터 자식 프로세스의 실행이 완료 될 때까지 차단됩니다. – goh

답변

4

그래,하지 마시고 대신 celery을 사용하십시오. 비동기 작업을 훨씬 쉽고 안정적으로 수행 할 수 있습니다.

+1

샐러리는 단지 하나의 스크립트를 실행하는 것 때문에 잔인한 것처럼 보입니다. – goh

+1

@amateur 다른 프로젝트에서 다시 사용하고 싶을 때 언제나 좋은 학습 과제로 간주 할 수 있을까요? –

+0

맙소사 아마 맞아. 나는 셀러리를 집어 들어야한다고 생각해야한다. – goh

1

cronery와 같은 비동기 작업 대기열을 사용하지 않으려면 cron을 통해 파이썬 스크립트를 실행할 수 있습니다. 이를 수행 할 수있는 몇 가지 옵션이 있습니다. 예 :

  • 모델의 값을 얻을 독립 파이썬/장고 스크립트를 작성 프로세스에 필요한 값을 저장하는 모델을 만드는 작업을 executee 데이터베이스 항목을 제거
관련 문제