使用嵌套类(Python)在进程之间共享队列

2024-05-15 10:10:15 发布

您现在位置: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()

Tags: selfstream队列queue进程initmaindef
2条回答

孩子现在要知道父亲的实施。我不赞成这样做

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

我建议您使用线程模块而不是进程。我建议您只在子类扩展父类的功能时使用嵌套类。在

class   WorkerThread(threading.Thread):

另一个建议是在子线程之间使用共享锁,以防止共享队列上出现争用情况。在

^{pr2}$

看看这个Example

相关问题 更多 >