gpt4 book ai didi

python - python 多处理队列可以传递给子进程吗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:18 24 4
gpt4 key购买 nike

我在用 python 编写的数据采集系统中有一个大数据集,需要无限长的时间才能将队列从子进程传递到父进程。我想保存在采集结束时获取的数据,并使用 queue 进行了尝试。函数位于 Multiprocessing 。如果我可以通过 queue 传递消息,而不是这样做,我会更喜欢它。在我终止子进程之前,从父进程到子进程保存我的数据。这可能吗?我认为它可能看起来像这样的一个例子:

def acquireData(self, var1, queue):
import h5py
# Put my acquisition code here
queue.get()
if queue == True:
f = h5py.File("FileName","w")
f.create_dataset('Data',data=data)
f.close()

if __name__ == '__main__':
from multiprocessing import Process, Queue
queue = Queue()
inter_thread = Process(target=acquireData, args=(var1,queue))
queue.put(False)
inter_thread.start()
while True:
if not args.automate:
# Let c++ threads run for given amount of time
# Wait for stop from OP GUI
else:
queue.put(True)
break
print("Acquisition finished, cleaning up...")
sleep(2)
inter_thread.terminate()

这是允许的吗?如果允许进程之间的这种类型的接口(interface),那么我是否有正确的符号?作为引用,我在尝试保存的数组中有 9e7 个数据点的顺序,并且我有 7 个数组,这些数组根本没有通过将这些数组放入 queue 及时传递给我的父进程。 。谢谢。

最佳答案

首先,是的,将队列传递给子级不仅合法,而且是队列的主要用例。请参阅the first example in the docs ,它正是这样做的。

但是,您的代码存在一些问题:

queue.get()
if queue == True:

首先,您的队列永远不会是 bool 值True,它将是一个队列。你几乎不想在 Python 中检查 if x == True:;你想检查if x:。例如,if [1, 2]: 将通过,而 if [1, 2] == True: 则不会。

其次,您的队列甚至不是您首先想要检查的东西。它不是真实的或虚假的(或者无论是真实的还是虚假的都无关紧要);它是主进程放入队列中的值,并且您得出的值要么是真,要么是假。你一拿到它就扔掉了。

所以,这样做:

flag = queue.get()
if flag:

或者,更简单地说:

if queue.get():
<小时/>

我不确定这是否正是您想要的。该 queue.get() 将永远阻塞,直到主进程将某些内容放在那里。这就是你想要的吗?如果是这样,那就太好了;您已经完成了这部分代码。如果没有,你需要考虑一下你想要什么。

按照设计,父进程将始终等待 2 秒,即使子进程在此之前很久就完成了。更好的解决方案是加入子级,超时时间为 2 秒。然后,如果超时,您可以终止它。

另外,您确定您设计的终止行为是您想要的吗?您正在对队列执行“软终止请求”,然后等待 2 秒,然后使用 terminate 执行“中硬终止请求”,并且从不使用 执行“硬终止” >杀死。这可能是一个完全合理的设计,但如果这不是您的设计,那么您就实现了错误的东西。

关于python - python 多处理队列可以传递给子进程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49434842/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com