2011-02-02 11 views
5

मैं ट्विस्टेड में एक नेटवर्क अनुप्रयोग विकसित कर रहा हूं, जिसमें से एक Django में लिखा गया एक वेब इंटरफ़ेस शामिल है।मुड़: एक थ्रेडपूल बनाना और फिर डिमोनिज़िंग की वजह से अनौपचारिक लटकती है

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

-n ध्वज (डिमननाइज़ नहीं करें) के साथ सर्वर चलाते समय सब ठीक काम करता है, लेकिन जब यह ध्वज हटा दिया जाता है तो सर्वर अनुरोधों का जवाब नहीं देता है, और कोई संदेश लॉग नहीं होता है (हालांकि सर्वर है अभी भी दौड़ रहा है)।

एक bug on Twisted's Trac है जो वास्तव में समस्या का वर्णन करने लगता है, और मेरी प्लगइन code referenced in the ticket पर आधारित होती है।

दुर्भाग्यवश, समस्या को ठीक नहीं किया गया है - और यह लगभग एक साल पहले उठाया गया था।

मैं एक ThreadPoolService वर्ग है, जो Service प्रदान करता है और शुरू होता है बनाने के लिए प्रयास किया है एक ThreadPool दिया जब startService कहा जाता है:

class ThreadPoolService(service.Service): 
    def __init__(self, pool): 
     self.pool = pool 

    def startService(self): 
     super(ThreadPoolService, self).startService() 
     self.pool.start() 

    def stopService(self): 
     super(ThreadPoolService, self).stopService() 
     self.pool.stop() 

हालांकि, मुड़ बिल्कुल startService विधि बुला जा करने के लिए प्रतीत नहीं होता। मुझे लगता है कि समस्या यह है कि "टैप" प्लगइन के साथ, ServiceMaker केवल एक सेवा शुरू करने के लिए लौट सकता है - और उसी एप्लिकेशन से संबंधित किसी भी अन्य व्यक्ति को प्रारंभ नहीं किया जा सकता है। जाहिर है, मैं TCPServer सेवा लौट रहा हूं जिसमें डब्लूएसजीआई रूट शामिल है।

इस बिंदु पर, मैंने कुछ ईंट की दीवार पर कुछ हद तक मारा है। क्या किसी के पास कोई विचार है कि मैं इस मुद्दे के आसपास कैसे काम कर सकता हूं?

उत्तर

7

अपने ServiceMaker से MultiService लौटें; एक जिसमें आपका ThreadPoolService साथ ही आपकी मुख्य एप्लिकेशन सेवा भी शामिल है। ऐसी बात कोडांतरण के लिए एपीआई बिल्कुल स्पष्ट है:

multi = MultiService() 
mine = TCPServer(...) # your existing application service 
threads = ThreadPoolService() 
mine.setServiceParent(multi) 
threads.setServiceParent(multi) 
return multi 

को देखते हुए आप पहले से ही मुड़ के भीतर इस भ्रामक मुद्दे से निपटने के लिए टिकट पाया है कि, मैं अपने पैच :) देखने के लिए उत्सुक।

+0

यह सही है। मुझे नहीं पता कि मैंने इसे दस्तावेज में क्यों नहीं देखा, लेकिन यह एक आकर्षण की तरह काम करता है। धन्यवाद! –

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