2012-01-17 10 views
8

मेरे पास एक लंबी चल रही प्रक्रिया है जो हर पांच मिनट में चलनी चाहिए, लेकिन प्रक्रियाओं के एक से अधिक उदाहरण एक ही समय में कभी नहीं चलना चाहिए। प्रक्रिया सामान्य रूप से पिछले पांच मिनट में नहीं चलनी चाहिए, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि दूसरा उदाहरण शुरू होने पर शुरू नहीं होता है।डीजेगो सेलेरी: लंबे समय तक चलने वाली प्रक्रिया का केवल एक उदाहरण निष्पादित करें

प्रति previous recommendation पर, मैं इस लंबे समय तक चलने वाले कार्य को निर्धारित करने के लिए Django Celery का उपयोग कर रहा हूं।

मुझे नहीं लगता कि एक आवधिक कार्य काम करेगा, क्योंकि यदि मेरे पास पांच मिनट की अवधि है, तो मैं कार्य करने का दूसरा उदाहरण पहले से चलने पर दूसरा कार्य निष्पादित नहीं करना चाहता हूं।

मेरा वर्तमान प्रयोग इस प्रकार है: 8:55 पर, कार्य का एक उदाहरण चलना शुरू हो जाता है। जब कार्य खत्म हो रहा है, तो यह अगले पांच मिनट के निशान पर चलाने के लिए खुद का एक और उदाहरण ट्रिगर करेगा। तो यदि पहला कार्य 8:57 बजे समाप्त हुआ, तो दूसरा कार्य 9:00 बजे चलाया जाएगा। यदि पहला कार्य लंबे समय तक चलने और 9:01 बजे समाप्त होता है, तो यह अगले उदाहरण को 9:05 बजे चलाने के लिए शेड्यूल करेगा।

मैं नीचे दिए गए सरल उदाहरण से कुछ भी करने के दौरान विभिन्न प्रकार की गुप्त त्रुटियों के साथ संघर्ष कर रहा हूं और मुझे अपने पिछले उदाहरण से कार्यों को शेड्यूल करने वाले लोगों के अन्य उदाहरण नहीं मिला है। मैं सोच रहा हूं कि ऐसा करने के लिए शायद एक बेहतर तरीका है जो मैं करने की कोशिश कर रहा हूं। मुझे पता है कि किसी के कार्यों का नाम देने का एक तरीका है; शायद एक ही नाम के साथ चल रहे या अनुसूचित उदाहरणों की खोज करने का कोई तरीका है? क्या किसी को हर पांच मिनट में एक कार्य चलाने के बारे में कोई सलाह है, लेकिन यह सुनिश्चित करना कि एक समय में केवल एक ही कार्य चल रहा है?

धन्यवाद, जो

mymodule/tasks.py में:

import datetime 
from celery.decorators import task 

@task 
def test(run_periodically, frequency): 

    run_long_process() 
    now = datetime.datetime.now() 
    # Run this task every x minutes, where x is an integer specified by frequency 
    eta = (
     now - datetime.timedelta(
     minutes = now.minute % frequency , seconds = now.second, 
     microseconds = now.microsecond)) + datetime.timedelta(minutes=frequency) 
    task = test.apply_async(args=[run_periodically, frequency,], eta=eta) 

एक ./manage.py खोल से:

from mymodule import tasks 
result = tasks.test.apply_async(args=[True, 5]) 

उत्तर

7

आप उपयोग कर सकते हैं एक विशेष लॉक के साथ जोड़ा गया आवधिक कार्य जो सुनिश्चित करता है कि कार्य एक समय में निष्पादित किए जाते हैं।

http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

आपकी पिछली निष्पादन से समय निर्धारण कार्य के साथ वर्णित विधि कार्यों के निष्पादन को रोक सकता है अगर वहाँ उन में से एक में विफलता हो जाएगा: यहाँ अजवाइन प्रलेखन से एक नमूना कार्यान्वयन है।

+0

धन्यवाद 0x00mh। यह एक साफ लिंक है। मैं इसे आज़मा रहा हूं। –

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

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