לאחר כמות מסוימת של פעם שמישהו נוגע בעצמם עם מסגרת Django הולכת לשאול את השאלה: אני אוהב את האותות של Django, אכן. אבל אם רק הייתי יכול לשלוח אותם באופן אסינכרוני. כמו, על איזה חוט או משהו אחרים, אני לא ממש יודע .... האם זה איכשהו אפשרי?
ובכן, עכשיו אתה יכול בקלות לעשות את זה עם Django-signalqueue.
שעון, אני אראה לך. ראשית, התקנת Django-signalqueue:
$ פיפס להתקין # Django-signalqueue זה יתקין טורנדו ואופטימיות-ציר במידת צורך
... ייתכן גם רוצה חלק מחבילות אופציונליות אלה, אם אתה לא צריך אותם כבר:
לחלוט $ להתקין Redis yajl # s / לחלוט / apt-get / לטעם
$ PIP להתקין Redis hiredis # המליץ
$ פיפס להתקין ujson # מומלץ
$ פיפס להתקין czjson yajl simplejson # עבודה אלה גם
$ PIP להתקין # Django-האף האף לבדיקות
להוסיף Django-signalqueue לINSTALLED_APPS שלך, ואת ההגדרות לתור, בזמן שאתה בsettings.py שלך:
# Settings.py
INSTALLED_APPS = [
& Nbsp; 'signalqueue', # ...
]
= SQ_QUEUES {
& Nbsp; 'ברירת המחדל': {# אתה צריך dict לפחות אחד בשם 'ברירת מחדל' בSQ_QUEUES
& Nbsp; 'NAME': 'signalqueue_default', # אופציונאלי - ברירת מחדל הוא 'signalqueue_default'
& Nbsp; 'ENGINE': 'signalqueue.worker.backends.RedisSetQueue', # הנדרש - זה הנהג של התור שלך
& Nbsp; 'INTERVAL': 30, # 1/3 שניות
& Nbsp; 'אפשרויות': dict (),
& Nbsp;},
}
SQ_RUNMODE = משלוח סינכרוני # השימוש 'SQ_ASYNC_REQUEST' כברירת מחדל
SQ_WORKER_PORT = 11231 # נמל התהליך עובד התור שלך להיקשר ל
מלבד כל זה, אתה רק צריך להתקשר לsignalqueue.autodiscover () בURLConf השורש שלך:
# Urls.py
signalqueue יבוא
signalqueue.autodiscover ()
ניתן להגדיר אותות סינכרוני!
אותות Asynchronous מקרים של signalqueue.dispatch.AsyncSignal שהגדרתם באחד מהמקומות הבאים:
- Your_app / signals.py (זה בסדר אם אתה כבר משתמש בקובץ זה, כפי שרבים עושים)
- מודולים בשם ברשימת settings.SQ_ADDITIONAL_SIGNALS או tuple
- בקרוב: signalqueue.register () - כך שאתה יכול לשים אותם בכל מקום אחר.
AsyncSignals מוגדר בדומה למקרים המוכרים של django.dispatch.Signal אתה מכיר ואוהב:
# Yourapp / signals.py
מAsyncSignal יבוא signalqueue.dispatch
מsignalqueue.mappings לייבא ModelInstanceMap
# שני בנאים אלה עושים את אותו הדבר
my_signal = AsyncSignal (providing_args = ['מופע']) # Yuge
my_other_signal = AsyncSignal (providing_args = {'מופע': ModelInstanceMap}) # עם מיפויים
# מה כדלקמן יכול ללכת לשום מקום - רק מקרים צריכים להיות בyourapp / signals.py:
התקשרות def (שולח, ** kwargs):
& Nbsp; הדפסה "אני,% s, כבר שיגר בזאת באופן אסינכרוני על ידי% s, הודות לאופטימיות-signalqueue." % (
& Nbsp; str (kwargs ['מופע']),
& Nbsp; שולח .__ name__)
my_signal.connect (callback)
... ההבדל העיקרי הוא בהגדרה השנייה, אשר מציינת providing_args כdict עם כיתות מיפוי במקום ברשימה רגיל. אנחנו נסביר כיתות מיפוי בהמשך, אבל אם אתה עובר מקרי מודל Django לאותות שלך, אתה לא צריך לדאוג בקשר לזה.
ברגע שהעובד פועל, אתה יכול לשלוח את האות לתור כך:
>>> My_signal.send (שולח = AModelClass, למשל = a_model_instance)
לפטר את האות שלך כמו אות Django נורמלית, אתה יכול לעשות את זה:
>>> My_signal.send_now (שולח = AModelClass, למשל = a_model_instance)
מנגינה במחר למסקנה המדהימה של ... README Django-signalqueue !!!!!!
דרישות :
- > Python
- Django
תגובות לא נמצא