Как отложить операцию Django DB из Twisted? - PullRequest
6 голосов
/ 29 октября 2009

У меня работает нормальный сайт Django. Кроме того, есть еще один витой процесс, который прослушивает уведомления о присутствии Jabber и обновляет базу данных Django с помощью ORM Django.

Пока все работает, я просто называю соответствующие модели Django (после правильной настройки среды настроек). Это, однако, блокирует приложение Twisted, а это не то, что мне нужно.

Поскольку я новичок в твисте, я не знаю, как лучше всего получить доступ к БД Django (через ORM) неблокирующим способом, используя deferreds.

  1. deferredGenerator?
  2. twisted.enterprise.adbapi? (обойти ОРМ?)
  3. ???

Если сообщение о присутствии анализируется, я хочу сохранить в базе данных Django, что пользователь с jid_str находится в режиме онлайн / офлайн (используя модель Django UserProfile). Я делаю это с этой функцией:

def django_useravailable(jid_str, user_available):
    try:
        userhost = jid.JID(jid_str).userhost()
        user = UserProfile.objects.get(im_jabber_name=userhost)
        user.im_jabber_online = user_available
        user.save()
        return jid_str, user_available
    except Exception, e:
        print e
    raise jid_str, user_available,e

В настоящее время я вызываю его с помощью:

d = threads.deferToThread(django_useravailable, from_attr, user_available)
d.addCallback(self.success)
d.addErrback(self.failure)

Ответы [ 3 ]

1 голос
/ 05 ноября 2009

Я успешно использовал метод, который вы описали как ваш текущий метод. Читая документы, вы обнаружите, что API-интерфейс витой БД использует потоки внутри, потому что большинство библиотек SQL имеют API блокировки.

У меня есть витой сервер, который сохраняет данные с мониторов питания в полевых условиях, и он делает это, периодически запуская подпроток и вызывая мой код сохранения Django. Вы можете прочитать больше о моем конвейере сбора данных в реальном времени (это ссылка на блог).

Вы говорите, что запускаете подпоток и что все еще блокирует?

1 голос
/ 29 октября 2009

«У меня работает нормальный сайт Django.»

Предположительно под Apache, используя mod_wsgi или аналогичный.

Если вы используете mod_wsgi, встроенный в Apache, обратите внимание, что Apache является многопоточным, и ваши потоки Python смешиваются с потоками Apache. Анализ того, что блокирует, может стать неприятным.

Если вы используете mod_wsgi в режиме демона (которым вы должны быть), тогда ваш Django - это отдельный процесс.

Почему бы не продолжить этот шаблон проектирования и не сделать свой "слушатель jabber" отдельным процессом.

Если вы хотите, чтобы этот процесс запускался на любом из нескольких серверов, запустите его с init.rc или cron.

Поскольку это отдельный процесс, он не будет бороться за внимание. Процесс Django выполняется быстро, а слушатель Jabber работает независимо.

0 голосов
/ 06 ноября 2009

У меня работает приложение Twisted, в котором я использую Django ORM. Я не откладываю это. Я знаю, что это неправильно, но проблем пока не было.

...