2012-07-17 12 views
41

मैं समझने के लिए कितना बहु कतार अजगर और कैसे इसे लागू करने पर काम करता है की कोशिश कर रहा ज्यादा परेशानी आ रही है। आइए कहें कि मेरे पास दो पायथन मॉड्यूल हैं जो साझा फ़ाइल से डेटा तक पहुंचते हैं, आइए इन दो मॉड्यूल को एक लेखक और पाठक को कॉल करें। मेरी योजना है कि पाठक और लेखक दोनों अलग-अलग मल्टीप्रोसेसिंग कतारों में अनुरोध करें, और उसके बाद तीसरी प्रक्रिया इन अनुरोधों को लूप में पॉप करें और इस तरह निष्पादित करें।पायथन में मल्टीप्रोसेसिंग कतार का उपयोग कैसे करें?

मेरी मुख्य समस्या यह है कि मैं वास्तव में नहीं जानता कि multiprocessing.queue को सही ढंग से कैसे कार्यान्वित किया जाए, आप वास्तव में प्रत्येक प्रक्रिया के लिए ऑब्जेक्ट को तुरंत चालू नहीं कर सकते क्योंकि वे अलग-अलग कतार होंगे, आप कैसे सुनिश्चित करते हैं कि सभी प्रक्रियाएं संबंधित हैं साझा कतार (या इस मामले में, कतारों)

+3

जब आप माता-पिता प्रक्रिया में तत्काल होते हैं तो पैरामीटर के रूप में प्रत्येक प्रक्रिया वर्ग में पंक्तियां पास करते हैं। –

उत्तर

57

मेरा मुख्य समस्या मैं वास्तव में कैसे multiprocessing.queue सही ढंग से लागू करने के लिए पता नहीं है, आप वास्तव में प्रत्येक प्रक्रिया के लिए वस्तु का दृष्टांत नहीं कर सकते क्योंकि वे अलग कतारों हो जाएगा , आप कैसे सुनिश्चित करें कि सभी प्रक्रियाओं एक साझा कतार से संबंधित कर सकता हूँ (या इस मामले में, कतारों)

यह एक पाठक और लेखक के लिए एक एकल पंक्ति साझा करने का एक सरल उदाहरण है ... लेखक पाठक को पूर्णांकों का एक गुच्छा भेजता है; जब लेखक संख्याओं से बाहर हो जाता है, तो यह 'डोन' भेजता है, जो पाठक को पढ़ने लूप से बाहर निकलने की जानकारी देता है।

from multiprocessing import Process 
from queue import Queue 
import time 

def reader(queue): 
    ## Read from the queue 
    while True: 
     msg = queue.get()   # Read from the queue and do nothing 
     if (msg == 'DONE'): 
      break 

def writer(count, queue): 
    ## Write to the queue 
    for ii in xrange(0, count): 
     queue.put(ii)    # Write 'count' numbers into the queue 
    queue.put('DONE') 

if __name__=='__main__': 
    for count in [10**4, 10**5, 10**6]: 
     queue = Queue() # reader() reads from queue 
          # writer() writes to queue 
     reader_p = Process(target=reader, args=((queue),)) 
     reader_p.daemon = True 
     reader_p.start()  # Launch reader() as a separate python process 

     _start = time.time() 
     writer(count, queue) # Send a lot of stuff to reader() 
     reader_p.join()   # Wait for the reader to finish 
     print "Sending %s numbers to Queue() took %s seconds" % (count, 
      (time.time() - _start)) 
+6

महान उदाहरण। बस के रूप में जानकारी का एक अतिरिक्त बिट ओ पी के भ्रम की स्थिति पता करने के लिए ... यह उदाहरण दिखाता है कि एक साझा कतार मास्टर प्रक्रिया है, जो तब अपनी subprocesses सभी को पारित कर दिया है से ही शुरू की जरूरत है। डेटा साझा करने के लिए दो पूरी तरह से असंबंधित प्रक्रियाओं के लिए, उन्हें कुछ केंद्रीय या संबंधित नेटवर्क डिवाइस (उदाहरण के लिए सॉकेट) पर संवाद करना होगा। कुछ जानकारी को समन्वयित करना है। – jdi

+4

अच्छा उदाहरण .. मैं इस विषय के लिए भी नया हूं .. अगर मेरे पास एक ही लक्ष्य फ़ंक्शन (विभिन्न तर्कों के साथ) चलाने वाली कई प्रक्रियाएं हैं, तो यह सुनिश्चित करने के लिए कि वे कतार में डेटा डालने के दौरान संघर्ष नहीं करते हैं .. लॉक है ज़रूरी? बहु मॉड्यूल प्रलेखन से – WYSIWYG

+0

@bharat_iyengar, यह कहना है कि कतार में कुछ ताले/सेमाफोर का उपयोग कर कार्यान्वित किया जाता है। तो जब आप get() और put (ऑब्जेक्ट) कतार विधियों का उपयोग करते हैं, तो कतार ब्लॉक हो जाएगी यदि कुछ अन्य प्रक्रिया/धागा कतार पर कुछ प्राप्त करने या डालने का प्रयास कर रहा है। इसलिए आपको इसे मैन्युअल रूप से लॉक करने की चिंता करने की आवश्यकता नहीं है। – almel

1
में

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

+0

https://docs.python.org/3/library/queue.html – Jakub