使用 python 如何使用队列在子进程和主进程之间传递数据?

Using python how can I pass data between child and main processes with Queue?

期望目标

传递信息给其他子进程或主进程

担忧

-进程永远不会完成是个问题吗?

-class 方法从来没有 return/finish 有问题吗?

会不会导致堆栈溢出? (我希望 运行 几个小时)。

备选

拥有几个不同的脚本并保存到从 database/pickle 加载是否合适?

有效方法

如果我将多处理交换为线程,则可以获得所需的输出。

尝试过

-尝试将多处理切换为线程,这似乎给了我想要的结果,但想了解为什么多处理没有给出相同的输出。

-尝试使用 Queue() 或 LifoQueue()

-尝试从另一个子进程而不是主脚本 运行 宁并打印 Queue.get()

-已尝试 .join() 所有任务

期望输出

我希望在子进程中更改颜色并传递给队列,我希望使用 Queue.get() 检索新颜色。

例子

import multiprocessing
import threading
import time

class MyClass:
    def __init__(self):
        self.color = 'gray'
    
    def task_blue(self,q):
        print('sleeping 5..')
        time.sleep(5)
        while True:     
            time.sleep(1)
            self.color = 'blue'
            q.put([self.color])

    def task_red(self,q):
        print('sleeping 5..')
        time.sleep(5)
        while True:
            time.sleep(3)
            self.color = 'red'
            q.put([self.color])
        
    def printer(self,q):
        while True:
            time.sleep(.1)
            if q.empty():
                print('<empty>')
            else:
    
                print(q.get())

from queue import LifoQueue, Queue        
q = LifoQueue()
my_class = MyClass()

p1 = multiprocessing.Process(target=my_class.task_blue,args=(q,),name='BLUE')
p2 = multiprocessing.Process(target=my_class.task_red,args=(q,),name='RED')
# p3 = multiprocessing.Process(target=my_class.printer,args=(q,),name='PRINTER')

tasks = []
tasks.append(p1)
tasks.append(p2)
# tasks.append(p3)

for task in tasks:
    task.start()

while True:
    time.sleep(.2)
    if q.empty():
        print(['empty'])
    else:
        print(q.get())

输出

Is it a problem that the processes never finish?

一个进程可以永远 运行。

Is it a problem the class methods never return/finish?

没有。如果您希望您的程序永远 运行,那么将有一些代码段不会 return。如果这部分代码在方法内部就可以了。

I like the idea of the entire program being one script/class

您可以通过多种方式实现。这里没有正确答案,尤其是没有其他要求。

Tried using Queue() instead or LifoQueue() -Tried running and printing Queue.get() from another child subprocess instead of the main script -Tried .join() all the tasks

使用 multiprocessing 包时,您应该使用多处理包 中的 Queue class 。例如。 queue = multiprocessing.Queue()。此处的文档:https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue