2010-09-27 14 views
5

मेरे मुड़ अजगर कार्यक्रम कभी इतनी बार इस संदेश को उगल रहता है:मुड़: बेकार "AlreadyCalled" त्रुटि

Unhandled error in Deferred: 

Traceback (most recent call last): 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 757, in gotResult 
    _inlineCallbacks(r, g, deferred) 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 747, in _inlineCallbacks 
    deferred.errback() 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 269, in errback 
    self._startRunCallbacks(fail) 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 312, in _startRunCallbacks 
    self._runCallbacks() 
--- <exception caught here> --- 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 328, in _runCallbacks 
    self.result = callback(self.result, *args, **kw) 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 243, in callback 
    self._startRunCallbacks(result) 
    File "c:\python25\lib\site-packages\twisted\internet\defer.py", line 298, in _startRunCallbacks 
    raise AlreadyCalledError 
twisted.internet.defer.AlreadyCalledError: 

यह भी उपयोगी नहीं है के रूप में यह मेरी स्रोत कोड के लिए कोई संदर्भ है ... मैं भी होता है defer.inlineCallbacks का उपयोग कर रहे हैं। कोई विचार क्या गलत हो सकता है?

उत्तर

7

यदि आपके पास गलत होने के बारे में कोई अन्य संकेत नहीं है (जैसे आपके यूनिट परीक्षण विशिष्ट मामलों को इंगित करते हैं जो इस कारण हैं, या यदि pyfunc का उत्तर यह स्पष्ट नहीं करता है कि यह क्यों हो रहा है) तो डिफरर्ड सक्षम करें

from twisted.internet import defer 
defer.setDebugging(True) 

या

twistd --debug [...] 

या

: डीबगिंग जहां स्थगित की पहली (और केवल अनुमति दी) परिणाम निर्दिष्ट किया जा रहा है के बारे में जानकारी प्राप्त करने के लिए

आपको जिस त्रुटि का सामना करना पड़ा है, उसके साथ आपको अतिरिक्त स्टैक निशान मिलेंगे। अतिरिक्त स्टैक निशान आपको बताएंगे कि प्रश्न में डिफरर्ड किया गया था और जहां इसे पहली बार बुलाया गया था (था। कैलबैक() या .errback() इसे बुलाया गया था)।

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

दुर्भाग्य से अतिरिक्त अस्पष्टता इस समय inlineCallbacks का उपयोग करने की लागत है। यह शायद surmountable है, लेकिन किसी को उस कार्य को लेने की जरूरत है।

+0

यह मदद करता है। मुझे बस एक त्रुटि मिली थी और यह मुझे कम से कम कहने में सक्षम था जहां स्थगित बनाया गया था, जो सहायक था – Claudiu

2

मुझे लगता है कि आपके कोड में कुछ कहां है, आप स्पष्ट रूप से स्थगित कॉलबैक को कॉल कर रहे हैं। यह कई बार भी हो रहा है। एक स्थगित कॉलबैक केवल एक बार निकाल दिया जा सकता है जो एक लंबे समय से प्रतीक्षित कार्य पूरा करने का संकेत देता है जिसके परिणामस्वरूप त्रुटि या सकारात्मक परिणाम होता है। ट्विस्टेड में उपरोक्त अपवाद को फेंकने के लिए एक तंत्र है, यदि आपने एक से अधिक बार स्थगित आग लगाने की कोशिश की है। ऐसे कई फायरिंग की संभावना अपने कोड में बाहर

raise AlreadyCalledError 
twisted.internet.defer.AlreadyCalledError 

की जांच:

from twisted.internet.defer import Deferred 
def func(x): print x 
d = Deferred() 
d.addCallbacks(func, func) 
d.callback('First fire') 
d.callback('Second fire') 

यह निम्न त्रुटि में परिणाम होगा:

निम्नलिखित कोड पर विचार करें। यह मुद्दा हो सकता है।

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