在django中的页面提交上运行并行进程

时间:2014-07-24 13:21:21

标签: python django parallel-processing

我想为pnr检查创建简单的网站。代码工作正常,但它一次只执行一项工作,或者将结果呈现给其他页面或发送邮件。在使用线程时,它会在后端发送邮件,直到页面仍然加载。 请有人给我建议。我也想在google appengine上运行它,所以我没有尝试过芹菜。

from django.http import HttpResponse
from bs4 import BeautifulSoup
import re
import requests
from django.shortcuts import render
from functools import partial, wraps
from django.core.mail import send_mail
import time
import thread


def checkpnr(request):
    return render(request, 'checkpnr.html')


def check(string, pnr, sleeptime, lock, *args):
    while 1:
    # entering critical section
        lock.acquire()

    # time1=request.get_all("notif")
        url_pnr = "pnr url"

        r = requests.get(url_pnr)

        data = r.text
        soup = BeautifulSoup(data)
        train = str(soup.find("ul", attrs={"class": "train_info"}))
        train_number = soup.find("li", attrs={"class": "first"}).text
        source = str(soup.find("travellers"))

        route = str(soup.findAll("li")[1]).replace(
            '<li>', '').replace('</li>', '')
        #head, sep, tail = route.partition(' -')
        travel_date = str(soup.findAll("li")[2].text)
        date, sep, total = travel_date.partition('|')

        rows = soup.findAll("td", attrs={"class": "pax"})
        rowlength = len(rows)
        chart_status = str(soup.findAll("tr")[rowlength + 1].findAll("td")[0]).replace(
            '<td colspan="3"><strong>', '').replace('</strong>', '').replace('</td>', '')

        passengers = []
        status = []
        coach = []
        tot = []
        w=''
        i = 1
        j = 1
        while i <= rowlength:

            j = str(soup.findAll("tr")[i].findAll(
                    "td")[0].text).replace(':', '')
            passengers.append(j)
            s = str(soup.findAll("tr")[i].findAll("td")[1].text)
            w=w+','+s
            status.append(s)

            c = str(soup.findAll("tr")[i].findAll("td")[2].text)
            coach.append(c)
            tot.append(i)
            i += 1

            time.sleep(sleeptime)

        emailMsg = status

        subject = pnr+'-'+w
        send_mail(
                subject,'emailMsg', 'email-from',
                [email], fail_silently=False)

        lock.release()

        if (status[rowlength - 1] == "CONFIRMED"):
            time.sleep(sleeptime)
        else:
            time.sleep(1000000000000000000000000)


def fetch(request):

    pnr = request.POST['pnr']
    if len(pnr) != 10:
        msg = "PNR must be of 10 digits ..."
        return render(request, 'checkpnr.html', {'msg': msg})

    email = request.POST['email']

    e = request.POST['ntime']
    if (e != ''):
        n_time = int(e)

    n = request.POST['notify']
    if (n != ''):
        notify = int(n)
        sleeptim = notify * n_time
        sleeptime= 10

    # time1=request.get_all("notif")
    url_pnr = "pnr url"

    try:
        r = requests.get(url_pnr)
        data = r.text
        soup = BeautifulSoup(data)
        train = str(soup.find("ul", attrs={"class": "train_info"}))
        train_number = soup.find("li", attrs={"class": "first"}).text
        source = str(soup.find("travellers"))

        route = str(soup.findAll("li")[1]).replace(
            '<li>', '').replace('</li>', '')
        #head, sep, tail = route.partition(' -')
        travel_date = str(soup.findAll("li")[2].text)
        date, sep, total = travel_date.partition('|')

        rows = soup.findAll("td", attrs={"class": "pax"})
        rowlength = len(rows)
        chart_status = str(soup.findAll("tr")[rowlength + 1].findAll("td")[0]).replace(
            '<td colspan="3"><strong>', '').replace('</strong>', '').replace('</td>', '')

        passengers = []
        status = []
        coach = []
        tot = []
        w=''
        i = 1
        j = 1
        while i <= rowlength:

            j = str(soup.findAll("tr")[i].findAll(
                "td")[0].text).replace(':', '')
            passengers.append(j)
            s = str(soup.findAll("tr")[i].findAll("td")[1].text)
            w=w+','+s
            status.append(s)
            c = str(soup.findAll("tr")[i].findAll("td")[2].text)
            coach.append(c)
            tot.append(i)
            i += 1

        msg = "Mail not Sent"

        msg1 = ''

        if(email != ''):
            emailMsg = status
            subject = pnr+'-'+w
            send_mail(
                subject,'emailMsg', 'ashutosh8nitjsr@gmail.com',
                [email], fail_silently=False)
            msg = "mail sent.."

            if __name__ == "__main__":
                lock = thread.allocate_lock()
                thread.start_new_thread(
                check,("Thread No:1", pnr, email, sleeptime, lock))
                msg1 = "thread created"
                time.sleep(sleeptime)
                while 1:
                    pass

        detail2 = {
            'train_number': train_number, 'route': route, 'date': date, 'chart_status': chart_status, 'tot': tot,
            'passengers': passengers, 'status': status, 'coach': coach, 'msg': msg}

        return render(request, 'status.html', detail2)l
    except:
        msg = "there was error. please try again..."
        return render(request, 'checkpnr.html', {'msg': msg})

1 个答案:

答案 0 :(得分:0)

您可以在app引擎上尝试将TaskQueues用于此目的。

Task Queue API