के रूप में , किसी async कार्य को उत्पन्न करना और तुरंत ब्लॉक करना और उसके समाप्त होने तक प्रतीक्षा करना शायद ही उपयोगी हो।
इसके अलावा, यदि आप इसे इस तरह से संलग्न करते हैं (.get()
अंत में), आप सुनिश्चित हो सकते हैं कि mymodel
आपके कार्यकर्ता द्वारा अभी किए गए उदाहरण परिवर्तन नहीं देखे जाएंगे क्योंकि वे अभी तक प्रतिबद्ध नहीं होंगे - याद रखें कि आप अभी भी atomic
के अंदर हैं ब्लॉक करें।
इसके बजाय आप क्या कर सकते हैं (Django 1.9 से) django.db.transaction.on_commit
का उपयोग करके वर्तमान सक्रिय लेनदेन के प्रतिबद्ध होने तक कार्य में देरी हो रही है। हुक:
from django.db import transaction
with transaction.atomic():
mymodel.save()
transaction.on_commit(lambda:
mytask.delay(mymodel.id))
मैं अपने post_save
. में अक्सर इस पैटर्न का उपयोग करता हूं सिग्नल हैंडलर जो नए मॉडल इंस्टेंस की कुछ प्रोसेसिंग को ट्रिगर करते हैं। उदाहरण के लिए:
from django.db import transaction
from django.db.models.signals import post_save
from django.dispatch import receiver
from . import models # Your models defining some Order model
from . import tasks # Your tasks defining a routine to process new instances
@receiver(post_save, sender=models.Order)
def new_order_callback(sender, instance, created, **kwargs):
""" Automatically triggers processing of a new Order. """
if created:
transaction.on_commit(lambda:
tasks.process_new_order.delay(instance.pk))
इस तरह, हालांकि, आपका कार्य निष्पादित नहीं किया जाएगा यदि डेटाबेस लेनदेन विफल हो जाता है। यह आमतौर पर वांछित व्यवहार होता है, लेकिन इसे ध्यान में रखें।
संपादित करें :इस तरह से on_commit सेलेरी कार्य को पंजीकृत करना वास्तव में अच्छा है (w/o lambda):
transaction.on_commit(tasks.process_new_order.s(instance.pk).delay)