Merci Kevin Samuel de ta réponse,

Néanmoins, dans mon cas, je cherche plus à monter des informations en temps
réel et je pensais formuler une requete pour lire mais en effet, comme le
set de models sont géré principalement par l'application tornado, si mes
informations récentes sont toutes en ram quand elle montent, je peux
reporter l'écriture.

Je cherchais un truc plus souple qui permette de lire mais c'est vrai que
cette méthode doit pouvoir faire l'affaire.

Utiliser pika au lieu de celery pour accéder directement à rabbitmq me
ferme la porte de changer de backend plus tard mais doit permettre à
tornado d'être à la fois producer et consumer. (à l'heure actuelle mon
service django fait des requettes http avec urllib2 pour notifier tornado)

Merci pour ta tache de modification de modele générique.

J'hésite maintenant entre 3 pistes:

   - celery dans tornado (pas intégré ac le réacteur mais si on utilise
l'async pour de l'écriture simple c'est probablement jouable)
   - pika: plus de code et de recherche nécessaire mais plus souple
   - zmq: plus de risques de notifications droppées mais ce qu'il y a de
plus souple et un peu plus simple que pika. Néanmoins, cette solution
implique que je lance encore des services complémentaires, or je dépends
déjà de bcps de services ^^. (tornado, celeryd, celerybeat, django, un
serveur twisted pour remontées par socket de périphériques embarqués...)


2012/7/25 Kevin Samuel <[email protected]>

> Je ne connais pas de moyen de rendre l'ORM Django asyncrone, mais nous
> avons la même problématique que vous et nous l'avons résolu en
> encaspulant systématiquement les opérations blocantes dans une task
> celery.
>
> Par exemple, une des tâches pour écrire dans la base de donnée
> ressemble à:
>
> [code]from django.db import models
> from celery import task
>
> @task
> def update_model(app, model, filters, ,values):
>
>      model = models.get_model(app, model)
>      model.objects.filters(**filters).update(**values)[/code]
>
> Et dans le code que l'on veut non bloquant:
> [code]
> import datetime
> from tasks import update_model
>
> # update tous les models créés avant aujourd'hui
> update_model.apply_async(['ma_super_app', 'MonSuperModel',
> {(created_date__lt': datetime.datetime.now()}, {'super_attribut':
> 'nouvelle_valeur'}])[/code]
>
> Ce n'est pas super DRY, mais c'est simple et ça fait le boulot.
> _______________________________________________
> django mailing list
> [email protected]
> http://lists.afpy.org/mailman/listinfo/django
>



-- 
Best regards,
Christophe Narbonne

http://blogs.dotnet-france.com/christophen/
_______________________________________________
django mailing list
[email protected]
http://lists.afpy.org/mailman/listinfo/django

Répondre à