使用 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
期望目标
传递信息给其他子进程或主进程
担忧
-进程永远不会完成是个问题吗?
-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