2013-04-08 10 views
5

प्लोन 4 का उपयोग करने में, मैंने कस्टम सामग्री प्रकार सहेजे जाने पर अतिरिक्त प्रोसेसिंग करने के लिए सफलतापूर्वक एक ग्राहक ईवेंट बनाया है। यह मैंने Products.Archetypes.interfaces.IObjectInitializedEvent इंटरफ़ेस का उपयोग करके पूरा किया।प्लोनिंग ग्राहक घटनाओं को अतुल्यकालिक रूप से चलाना

configure.zcml

<subscriber 
     for="mycustom.product.interfaces.IRepositoryItem 
      Products.Archetypes.interfaces.IObjectInitializedEvent" 
     handler=".subscribers.notifyCreatedRepositoryItem" 
    /> 

subscribers.py

def notifyCreatedRepositoryItem(repositoryitem, event): 
    """ 
    This gets called on IObjectInitializedEvent - which occurs when a new object is created. 
    """ 
    my custom processing goes here. Should be asynchronous 

हालांकि, अतिरिक्त संसाधन कभी कभी बहुत लंबा समय लग सकता है, और अगर वहाँ पृष्ठभूमि में इसे चलाने के लिए एक रास्ता है मैं सोच रहा था यानी असीमित रूप से।

क्या ग्राहक घटनाओं को असीमित रूप से चलाने के लिए संभव है उदाहरण के लिए जब कोई ऑब्जेक्ट सहेज रहा है?

उत्तर

6

बॉक्स से बाहर नहीं। आपको अपने पर्यावरण में एसिंच समर्थन जोड़ने की आवश्यकता होगी।

plone.app.async पर एक नज़र डालें; आपको एक ज़ीओ पर्यावरण और कम से कम एक अतिरिक्त उदाहरण की आवश्यकता होगी। उत्तरार्द्ध आपकी साइट से कतार में धक्का एसिंक नौकरियां चलाएगा।

फिर आप अतुल्यकालिक रूप से निष्पादित करने के तरीकों को परिभाषित कर सकते हैं और इस तरह की विधि को अतुल्यकालिक रूप से निष्पादित करने के लिए कार्य को कतार में धक्का दे सकते हैं।

उदाहरण कोड, कतार में एक कार्य धक्का:

from plone.app.async.interfaces import IAsyncService 

async = getUtility(IAsyncService) 
async.queueJob(an_async_task, someobject, arg1_value, arg2_value) 

और कार्य ही:

def an_async_task(someobject, arg1, arg2): 
    # do something with someobject 

जहां someobject अपने ZODB में लगातार वस्तु है। IAsyncService.queueJobकम से कम एक फ़ंक्शन और संदर्भ ऑब्जेक्ट लेता है, लेकिन आप अपने कार्य को निष्पादित करने की आवश्यकता के रूप में कई और तर्क जोड़ सकते हैं। तर्क अचार होना चाहिए।

तब कार्य को वर्तमान अनुरोध के संदर्भ के बाहर, एसिंक कार्यकर्ता उदाहरण द्वारा निष्पादित किया जाएगा।

1

बस अधिक विकल्प देने के लिए, आप collective.taskqueue के लिए वास्तव में सरल और वास्तव में शक्तिशाली (और plone.app.async की कुछ कमियों से बचें) का प्रयास कर सकते हैं।

पीईपीआई पर विवरण पहले से ही आपको गति देने के लिए पर्याप्त है, और आप कतार प्रबंधन के लिए रेडिस का उपयोग कर सकते हैं जो एक बड़ा प्लस है।

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