2011-09-21 10 views
9

मुझे लगभग 150k Django वस्तुओं पर कार्यों को चलाने के लिए है। इसे करने का बेहतरीन तरीका क्या है? मैं ब्रोकर के रूप में Django ORM का उपयोग कर रहा हूँ। डेटाबेस बैकएंड MySQL है और chokes और सभी कार्यों के task.delay() के दौरान मर जाता है। संबंधित, मैं इसे एक फॉर्म जमा करने से भी लात मारना चाहता था, लेकिन परिणामी अनुरोध ने बहुत लंबे समय तक प्रतिक्रिया का समय दिया।django/अजवाइन: 150k Django वस्तुओं पर कार्यों को चलाने के लिए सर्वोत्तम प्रथाओं?

+1

यह ** बिल्कुल ** प्रश्न है जो मुझे चाहिए। बहुत ज्यादा अधिमूल्यित। – mlissner

उत्तर

10

मैं भी "दलाल" के रूप में डेटाबेस का उपयोग कर के अलावा कुछ प्रयोग करने पर विचार होगा। यह वास्तव में इस तरह के काम के लिए उपयुक्त नहीं है।

from celery.task import TaskSet, task 

from myapp.models import MyModel 

@task 
def process_object(pk): 
    obj = MyModel.objects.get(pk) 
    # do something with obj 

@task 
def process_lots_of_items(ids_to_process): 
    return TaskSet(process_object.subtask((id,)) 
         for id in ids_to_process).apply_async() 
इसके अलावा

, जब से तुम शायद 15000 प्रोसेसर पर कार्रवाई की जरूरत नहीं है:

हालांकि, तो आप इस भूमि के ऊपर से कुछ अनुरोध/प्रतिक्रिया चक्र से बाहर अन्य कार्य बनाने के लिए एक कार्य शुरू करके ले जा सकते हैं इन वस्तुओं समानांतर में सभी को, आप की मात्रा में वस्तुओं विभाजित कर सकते कहना 100 या 1000 की:

from itertools import islice 
from celery.task import TaskSet, task 
from myapp.models import MyModel 

def chunks(it, n): 
    for first in it: 
     yield [first] + list(islice(it, n - 1)) 

@task 
def process_chunk(pks): 
    objs = MyModel.objects.filter(pk__in=pks) 
    for obj in objs: 
     # do something with obj 

@task 
def process_lots_of_items(ids_to_process): 
    return TaskSet(process_chunk.subtask((chunk,)) 
         for chunk in chunks(iter(ids_to_process), 
              1000)).apply_async() 
+0

धन्यवाद पूछो! @ एपीपीईएल और आपके सुझाव के साथ, मैं खरगोश एमक्यू ब्रोकर में चले गए और तुरंत लाभ देखा। इसके अलावा, इन कार्यों को शामिल करने की स्थापना की गई जो मैं प्राप्त करने की कोशिश कर रहा था !! –

+0

क्या आप टिप्पणी कर सकते हैं कि यह कोड कैसे काम कर रहा है और यह कितने कार्य पैदा कर रहा है? मैंने पिछले 4 दिनों से कोशिश की है और यह मेरा डेटाबेस लाता रहता है। मैं केवल 80% सीपीयू का उपयोग कर रहा हूं जब यह चल रहा है, लेकिन "MySQL दूर चला गया है" और थोड़ा सा चलने के बाद त्रुटियों को कनेक्ट कर रहा हूं। –

+0

लगता है जैसे आप अपने डेटाबेस को अधिभारित कर रहे हैं? क्या आप डेटाबेस में परिणाम संग्रहीत करते हैं? यह django-अजवाइन के लिए डिफ़ॉल्ट है। यदि आपको उनकी आवश्यकता नहीं है तो आपको '@ टास्क (ignore_result = True) 'सेट करना चाहिए या' CELERY_IGNORE_RESULT = True' का उपयोग करके उन्हें वैश्विक रूप से अक्षम करना चाहिए – asksol

2

इसके बजाय RabbitMQ का उपयोग करने का प्रयास करें।

खरगोश एमक्यू का उपयोग बहुत बड़ी कंपनियों में किया जाता है और लोग वास्तव में इस पर भरोसा करते हैं, क्योंकि यह इतना बड़ा ब्रोकर है।

Here is a great tutorial on how to get you started with it.

1

मैं इंजन के रूप में beanstalkd (http://kr.github.com/beanstalkd/) का उपयोग करें। यदि आप django-beanstalkd का उपयोग करते हैं तो एक कार्यकर्ता और कार्य जोड़ना बहुत सरल है: https://github.com/jonasvp/django-beanstalkd/

यह मेरे उपयोग के लिए बहुत विश्वसनीय है।

कार्यकर्ता का उदाहरण:

import os 
import time 

from django_beanstalkd import beanstalk_job 


@beanstalk_job 
def background_counting(arg): 
    """ 
    Do some incredibly useful counting to the value of arg 
    """ 
    value = int(arg) 
    pid = os.getpid() 
    print "[%s] Counting from 1 to %d." % (pid, value) 
    for i in range(1, value+1): 
     print '[%s] %d' % (pid, i) 
     time.sleep(1) 

एक नौकरी/कार्यकर्ता/कार्य का शुभारंभ करने के लिए:

from django_beanstalkd import BeanstalkClient 
client = BeanstalkClient() 

client.call('beanstalk_example.background_counting', '5') 

(Django-beanstalkd का उदाहरण ऐप से निकाला स्रोत)

का आनंद लें!

संबंधित मुद्दे