2009-10-29 3 views
6

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

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

Поскольку я новичок в скручивании, я не знаю, каким лучшим способом было бы получить доступ к DB Django (через его ORM) неблокирующим способом с использованием отложенных событий.

  1. Отложенный генератор?
  2. twisted.enterprise.adbapi? (обход ORM?)
  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) 
+1

Пожалуйста, отправьте код, особенно часть, которая «блокирует» ваше приложение. – ohnoes

ответ

1

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

Предположительно под Apache с использованием mod_wsgi или аналогичного.

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

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

Почему бы не продолжить этот шаблон дизайна и сделать ваш «jabber-слушатель» отдельным процессом.

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

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

+0

Я хотел бы иметь возможность перенести присутствие notificaiton обработчика на другой сервер, когда это необходимо. С технологическим решением это нелегко. Кроме того, мне нравится скрученная асинхронная оценка, которая, как я думаю, может обрабатывать огромные суммы уведомлений. Я полагаю, что будет намного больше notificatinos чем хиты вебсайта. – 2009-10-29 14:30:36

1

Я успешно использовал метод, который вы описали как ваш текущий метод. Вы увидите, прочитав документы, что скрученный DB api использует потоки под капотом, потому что большинство библиотек SQL имеют блокирующий API.

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

Вы говорите, что вы запускаете вспомогательную нить, и это еще блокирование?

+0

Но причина использования скрученного заключается в том, что мы делаем _not_ хотите использовать потоки. Если мне придется придерживаться текущей версии с резьбой, у меня нет преимуществ при использовании скрученной. Затем я мог бы использовать потоки непосредственно из процесса Django. – 2009-11-11 15:51:23

+0

Да, я ненавижу это тоже по этой причине. По крайней мере, вы можете убедиться, что запущено ограниченное количество потоков баз данных (например, управлять 1000 клиентскими подключениями и умножать их доступ к базе данных и потоки). Использование базы данных - это лишь небольшая часть моих долгосрочных подключений, управляемых скрученными, поэтому вполне нормально развернуть поток по требованию для меня. –

0

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

+0

Немного нерелевантно, не так ли? –