Совместное использование очередей между процессами с использованием вложенных классов (Python) - PullRequest
1 голос
/ 29 октября 2010

У меня есть вопрос о совместном использовании очередей между процессами в 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()

Ответы [ 2 ]

1 голос
/ 29 октября 2010

Я рекомендую вам использовать модуль потоков вместо процесса.Я предлагаю вам использовать вложенные классы только в том случае, если дочерние классы расширяют функциональность родительского класса.

class   WorkerThread(threading.Thread):

Другая рекомендация состоит в том, чтобы использовать разделяемую блокировку между вашими дочерними потоками, чтобы предотвратить состояние гонки в вашей общей папке.Очередь.

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

Посмотрите на это Пример

0 голосов
/ 29 октября 2010

Ребенок теперь должен знать о реализации отца.Я не одобряю это

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()
...