Django + new thread

Июнь 5, 2009

Понадобилось сделать что-то вроде запуска отдельного потока в джанго-приложении, работающем под апачем. В сети везде попадается один и тот же пример для такого случая:

import threading
from django.core.mail import send_mail

def foo(request, identifier):
    data = get_some_data(identifier)
    try:
        error_check(data) # raise exception if data invalid
    except InvalidData, e:
        # Format our information here, in the main thread
        subject = "Invalid data in entry %d" % identifier
        message = """
            There is an error in entry %d.  Please check this
            data at http://path/to/django/admin/app/table/%d.
        """ % (identifier, identifier)
        recipients = ['someone@somewere.com', 'someoneelse@somewhere.com']
        from = 'root@server.com'
        # Create a new thread in Daemon mode to send message
        t = threading.Thread(target=send_mail,
                             args=[subject, message, from, recipients],
                             kwargs={'fail_silently': True})
        t.setDaemon(True)
        t.start()
    return HttpResponseServerError(some_error_page)

Все замечательно, только не работает в нашем случаи, так как наша функция работает заметно дольше чем отправка письма. В результате через какое-то время наш поток прерывается, видимо апачем, который, наверное, чистит мусор после завершения запроса. Насколько я знаю, апач под каждый запрос создает поток, в связи с этим родилось следующее решение…

Ту функцию, которую необходимо запускать под отдельным потоком мы засунули в отдельный урл, который и вызывается в отдельном потоке ulrlib.urlopen(…).read() — не обязательно даже ждать завершения, ведь нам не интересен сам HttpResponse — мы не хотим его отображать на странице, нам важен сам запуск функции. На это времени хватает, запрос делает свою работу и кладет результаты в базу. Поведение достигнуто, хотя и немного нестандартными средствами —  хотя, возможно, нестандартными с точки зрения виндовс-программиста.

tags:
posted in Python by dmitko

6 Comments to "Django + new thread"

  1. Евгений wrote:

    А в nginx такой подход будет работать?

  2. dmitko wrote:

    Надо взять и попробовать — должен, на вскидку, вряд ли современные http-сервера не поддерживают одновременные запросы — такой сервер вряд ли выживет. Впрочем, результат все равно интересен — напишите его! Однако, при таком подходе есть определенные трудности — он (во всяком случаи в таком виде) не может использовать переменные сессии, так что, нужно все явно передавать в запросе, если параметров действительно много, то лучше использовать метод POST. В общем, можете связаться со мной, я могу проконсультировать подробнее — есть похожая статья в блоге, где эта же проблема решается все же через треды, но этот подход, бесспорно имеет право на жизнь.

  3. favouriteinvesting wrote:

    В состав нашей компании входит 30 человек — специалистов в сфере инвестиций и инвестиционного бизнеса. Компания разделена на четыре подразделения, каждое из которых занимается своим отдельным направлением, однако благодаря развитому маркетингу тесно друг с другом связаны.
    В каждом из четырех направлений мы предлагаем по три инвестиционных плана с различными процентными ставками и вариантами выплаты процентов.
    Узнать подробно о сфере нашей деятельности можно на сайте http://favouriteinvesting.biz/

  4. rulfiffidosum wrote:

    ????????????? ?????????. ????? ????? ?? ????? ? ???? ??????? ???? ???? ? ????.

  5. tcsindustryo wrote:

    Anastrozole (INN) (marketed covered by the trade mention Arimidex before AstraZeneca) is a non-steroidal] aromatase-inhibiting dope approved as treatment of breast cancer after surgery, as jet as benefit of metastasis in both pre and post-menopausal women. The rigidity of bosom cancer can be increased by way of estrogen, as having it away hormones cause hyperplasia, and differentiation at estrogen receptor sites.] Anastrozole works close to inhibiting the blending of estrogen. The tangible on Arimidex nearby AstraZeneca expired June 2010.
    The ATAC (Arimidex, Tamoxifen, Alone or in Combination) distress was an foreign randomised controlled trial of 9366 women with localized breast cancer who received either anastrozole, tamoxifen, or both in return five years, followed not later than five years of follow-up.] After more than 5 years the number that received anastrozole had significantly more advisedly clinical results than the tamoxifen group.] The pest suggested that anastrozole is the preferred medical remedy payment postmenopausal women with localized heart of hearts cancer, which is estrogen receptor (ER) positive.] Another study create that the gamble of recurrence was reduced 40%, but was associated with an increased endanger of bone fractures. The study concluded that ER undeniable patients benefited from switching from tamoxifen to anastrozole in patients who must completed 2 years’ adjuvant tamoxifen.] A more late contest originate that anastrozole significantly reduced the frequency of heart of hearts cancer in postmenopausal women applicable to placebo, and while there were side effects related to estrogen deprivation observed, the researchers concluded that this was probably not associated to the treatment. Assume command of prime mover Jack Cuzick was quoted by the BBC as saying, «This class of drugs is more serviceable than preceding drugs such as tamoxifen and crucially, it has fewer side effects,» adding that he thought there was these days enough statement to support present the treatment
    From TCS INDUSTRY LTD

  6. sergeysoschi1100998 wrote:

    Наша общество с ограниченной ответственностью «Инжгеосервис» воплощает услуги разработки проектов водоснабжения и канализации.
    Мы — это полный контроль. Мы — это инжиниринг высокого уровня. С нами вы экономите в 3 раза (в Водоканале проект стоит минимум от 50 т.р.)
    Наши телефоны: 8-988-185-8121
    От Вас:
    - технические условия
    - паспорт
    - топосъемка М1:500
    Срок 5 дней. Результат — проект под ключ!
    Мы находимся в Сочи, работаем по всем районам города.

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org