2015-12-15 10 views
5

मैं मल्टीप्रोसेसिंग को उपclass करना चाहता हूं। कतार के हिस्सों को पकड़ने के लिए प्रक्रियाओं को कार्यान्वित करने के लिए क्यूयू। एकमात्र समस्या यह है कि, मुझे एक अजीब टाइपरर मिल रहा है?मल्टीप्रोसेसिंग क्यूई सबक्लास समस्या

#!/usr/bin/env python 

#whaaaaa!? 

from multiprocessing import Queue 

class BufferQueue(Queue): 
    '''A thread/process safe queue for append/popleft operations with the import 
    buffer.''' 

    def __init__(self, **kwargs): 
     super(BufferQueue,self).__init__(**kwargs) 

    def consume(self, lim): 
     '''Consume up to but no more than lim elements and return them in a new 
     list, cleaning up the buffer. 

     @params 
     lim -- the maximum (limit) to consume from the list. If less items 
     exist in the list then that's fine too. 
     ''' 
     lim = len(queue) if len(queue) < lim else lim 
     return [self.popleft() for i in range(lim)] 

इस परीक्षण (मैं इस बाहर विभाजित ताकि मैं और कुछ में खींच नहीं किया गया था)

| => ./tests/wtf_queue.py 
Traceback (most recent call last): 
    File "./tests/wtf_queue.py", line 10, in <module> 
    class BufferQueue(Queue): 
TypeError: method expected 2 arguments, got 3 

संपादित करें/अद्यतन:

+0

द्वारा लौटाई गई वस्तु का कतार कैसे शुरू किया जा रहा है? – eugecm

+0

मैं नहीं हूं। आप जो देखते हैं वह संपूर्ण परीक्षण है। मैं वास्तव में किसी भी तरह से कॉल या इसका उपयोग नहीं कर रहा हूं। – SkyLeach

+0

मुझे लगता है कि यह multiprocessing के तरीके से कुछ करने के लिए किया गया है। Queue स्थानीय/साझा संसाधनों को संभालती है? टाइपडिफ के रूप में जेआईटी लोडिंग के दौरान क्लास विनिर्देश को कॉल करना मतलब है कि कोर में कुछ उलझ रहा है AFAICT – SkyLeach

उत्तर

5

multiprocessing.Queue एक विधि है कि कतारों बनाता है, तो आप इसे एक फ़ंक्शन my_queue = Queue() के रूप में उपयोग करने के लिए माना जाता है।

>>> from multiprocessing import Queue 
>>> type(Queue) 
<class 'method'> 

जैसा कि आप देख सकते हैं एक 'प्रकार' नहीं है, जिसे आप उपclass के लिए उपयोग करेंगे।

आप अपने खुद के कतार लागू करना चाहते हैं, तो आप पर एक नज़र ले सकता है queue.Queue

संपादित करें:

आप बहु से कतार, बजाय उपवर्ग का उपयोग multiprocessing.queues.Queue, जो प्रकार है चाहते हैं multiprocessing.Queue()

+1

हाँ दस्तावेज़ों को इसके बारे में कुछ करने की आवश्यकता है। इसे विशेष रूप से प्रलेखन में एक वर्ग कहा जाता है, और इसके अतिरिक्त समारोह एक वर्ग देता है। फिर, उस पर, queue.Queue serialized नहीं मिलता है और इस प्रकार मल्टीप्रोसेसिंग के लिए उपयोगी नहीं है। कतार पर धक्का देने वाली प्रक्रियाएं इसे उपभोग करने वाले व्यक्ति की तुलना में पूरी तरह से अलग दुभाषिया में होती हैं। – SkyLeach

+0

यह देखने के लिए अब यह परीक्षण कर रहा है कि यह काम करता है या टूटता है। मुझे संदेह है कि ऐसा करने से यह काम करेगा। – SkyLeach

+0

multiprocessing.queues.Queue का विस्तार करना और फिर प्रक्रिया प्रबंधक संदर्भ में इसे तुरंत चालू करना प्रतीत होता है (queue = BufferQueue (ctx = get_context())) – SkyLeach

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