2010-10-29 41 views
0

我有一個關於在Python中的進程之間共享隊列的問題。下面,我有三個隊列,一個主流程和三個內部流程。每個內部進程將添加並從各個隊列中獲取值(他們需要輕鬆訪問隊列)。使用嵌套類在進程間共享隊列(Python)

我認爲它現在可以正常工作,但是這個代碼是我要開展工作的一個大項目的基礎,我想確保沒有更好的方法來做到這一點,我不會不知道。我只是想出了這個想法。從其他一些帖子看來,嵌套類不是很像Python。

有什麼建議嗎?這段代碼容易或難以閱讀?放棄嵌套類還是保持原樣?

謝謝大家。

class MainController(Process): 
    def __init__(self): 
     self.queue_stream = Queue() 
     self.queue_language = Queue() 
     self.queue_expander = Queue() 

     self.control_stream = self.StreamController(self).start() 
     self.control_language = self.LanguageController(self).start() 
     self.control_expander = self.ExpanderController(self).start() 

     print 'Launching Main Controller' 

    class StreamController(Process): 
     def __init__(self, main): 
      Process.__init__(self) 
      self.main = main 
      print 'Launching Stream Controller' 

     def run(self): 
      while True: 
       self.main.queue_stream.put('hello, stream') 

    class LanguageController(Process): 
     def __init__(self, main): 
      Process.__init__(self) 
      self.main = main 
      print 'Launching Language Controller' 

     def run(self): 
      while True: 
       print self.main.queue_stream.get() 
       self.main.queue_language.put('hello, language') 

    class ExpanderController(Process): 
     def __init__(self, main): 
      Process.__init__(self) 
      self.main = main 
      print 'Launching Expander Controller' 

     def run(self): 
      while True: 
       print self.main.queue_language.get() 
       self.main.queue_expander.put('hello, expander') 

def main(): 
    # Launch all queues for the system 
    control_main = MainController() 

if __name__ == '__main__': 
    print 'Launching System...' 
    main() 

回答

0

孩子看看現在知道父親的實施。我勸阻

def infinite_producer(queue): 
    while True: 
     queue.put('hello, stream') 

class MainController(Process): 
    def __init__(self): 
     self.queue_stream = Queue() 
     self.queue_language = Queue() 
     self.queue_expander = Queue() 
     self.self.control_stream = Process(target=infinite_producer,self.queue_stream) 

    def run(self): 
     self.control_stream.start() 

#... etc you get the idea. 

if __name__ == '__main__': 
    print 'Launching System...' 
    control_main = MainController() 
    control_main.start() 
1

我建議您使用線程模塊而不是進程。我建議你只有在子類在父類的功能上擴展時才使用嵌套類。

class WorkerThread(threading.Thread): 

另一個建議是在子線程之間使用共享鎖,以防止共享隊列上的競爭條件。

  tasks_lock.acquire() 
      ret = tasks_queue.get() 
      tasks_lock.release() 

就拿這個Example

相關問題