我在一个用python编写的数据采集系统中有一个大数据集,它需要无限长的时间才能将队列从子进程传递到父进程。{{{I>试图在cd1>中保存获取的数据。与其这样做,我更希望通过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()
允许这样吗?如果允许进程之间的这种接口,那么我是否有正确的符号?为了便于参考,我在试图保存的数组中有9e7个数据点的顺序,我有7个数组,它们只是没有通过将这些数组放入queue
中而被及时传递给父进程。谢谢您。在
首先,是的,将队列传递给子队列不仅合法,而且是队列的主要用例。请参见the first example in the docs,它正是这样做的。在
但是,您的代码有一些问题:
首先,你的}则不会。在
queue
永远不会是布尔值True
,而是Queue
。在Python中,您几乎不想检查if x == True:
;而应该检查if x:
。例如,if [1, 2]:
将通过,而{第二,你的
queue
根本不是你首先想要检查的东西。它不是真的或假的(或者不管它是否相关),而是主进程放在队列上的值,你成功了,这要么是真的,要么是假的。你一找到它就把它扔了。在所以,这样做:
^{pr2}$或者,更简单地说:
我不确定这是否正是你想要的。这个
queue.get()
将永远阻塞,直到主进程在那里放置一些东西。这就是你想要的吗?如果是这样的话,那太好了;你已经完成了这部分代码。如果不是,你需要想想你想要什么。在按照设计,父对象总是等待2秒,即使孩子在这之前完成了。一个更好的解决方案是
join
子进程超时2秒。如果超时,则可以terminate
。在另外,你确定你设计的终止行为是你想要的吗?您正在对队列执行“软终止请求”,然后等待2秒,然后使用
terminate
执行“中等硬终止请求”,而从不使用kill
执行“硬杀死”。这可能是一个非常合理的设计,但如果不是你的设计,你已经实现了错误的事情。在相关问题 更多 >
编程相关推荐