2010-05-10 7 views
0

Je cherche un moyen de faire du traitement de données asynchrone avec un démon qui utilise Django ORM. Cependant, l'ORM n'est pas thread-safe; il n'est pas sûr pour les threads d'essayer de récupérer/modifier des objets django depuis des threads. Donc, je me demande quelle est la bonne façon d'atteindre l'asynchronie?Traitement de démon asynchrone/interaction ORM avec Django

Fondamentalement, ce que je dois accomplir est de prendre une liste d'utilisateurs dans la base de données, d'interroger une API tierce, puis de mettre à jour les lignes de profil utilisateur pour ces utilisateurs. En tant que démon ou processus d'arrière-plan. Faire cela en série par utilisateur est facile, mais cela prend trop de temps pour être tout à fait évolutif. Si le démon récupère et met à jour les utilisateurs via l'ORM, comment puis-je traiter 10 à 20 utilisateurs à la fois? J'utiliser un filetage standard/système de file d'attente pour cela, mais vous ne pouvez pas enfiler les interactions comme

models.User.objects.get(id=foo) ...

Django lui-même est un système de traitement asynchrone qui rend asynchrone appelle ORM (?) Pour chaque demande, il devrait donc y être un moyen de le faire? Je n'ai rien trouvé dans la documentation jusqu'à présent.

Vive

Répondre

2

Si votre traitement asynchrone est en cours dans son propre processus, puis le fil de sécurité est pas un problème parce que vos fils ne partagent pas un espace d'adressage, de sorte qu'ils ne peuvent pas interférer les uns avec les autres. Ils auraient chacun leur propre copie des objets modèles. La concurrence sera contrôlée par la base de données avec les transactions. Donc, votre amende.

Si vous allez générer un thread dans l'un des processus du serveur Web pour effectuer votre activité asynchrone, vous devez verrouiller tous les appels API qui ne sont pas thread-safe. Apache utilise plusieurs processus via l'appel système fork() pour gérer les requêtes Web conncurrent. C'est pourquoi les API ORM de Django n'ont pas besoin d'être thread-safe. Je crois qu'Apache peut utiliser des threads au lieu de processus, mais il pense que cette fonctionnalité doit être désactivée pour pouvoir utiliser Django.

http://groups.google.com/group/django-developers/browse_thread/thread/905f79e350525c95

BTW, comprenez-vous la différence entre un fil et un processus? C'est un genre d'important.

3

Jetez un oeil à celery. Je suppose que cela résoudrait votre problème. Il utilise un module multi-traitement. Il a besoin d'une (très) petite configuration, mais aide beaucoup dans la mise à l'échelle.