能否将python多处理队列传递给子进程?
我在用python编写的数据采集系统中有一个大数据集,它需要无限长的时间才能将队列从子进程传递到父进程。我想保存采集结束时采集的数据,并使用能否将python多处理队列传递给子进程?,python,queue,multiprocessing,h5py,Python,Queue,Multiprocessing,H5py,我在用python编写的数据采集系统中有一个大数据集,它需要无限长的时间才能将队列从子进程传递到父进程。我想保存采集结束时采集的数据,并使用多处理中的队列功能进行了尝试。如果我可以通过队列将一条消息从父进程传递给子进程,以便在终止子进程之前保存数据,而不是这样做,我更希望这样做。这可能吗?我认为它可能是这样的一个例子是: def acquireData(self, var1, queue): import h5py # Put my acquisition code here
多处理
中的队列
功能进行了尝试。如果我可以通过队列
将一条消息从父进程传递给子进程,以便在终止子进程之前保存数据,而不是这样做,我更希望这样做。这可能吗?我认为它可能是这样的一个例子是:
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.get()
if queue == True:
首先,您的队列
永远不会是布尔值True
,它将是一个队列
。在Python中,如果x==True:,您几乎不想检查;如果x:
,则要检查。例如,if[1,2]:
将通过,而if[1,2]==True:
将不通过
其次,您的队列甚至不是您首先要检查的东西。它不是真实的或虚假的(或者它与真实与否无关);这是主进程在队列中输入的值,而您得到的值不是真实的就是错误的。你一找回它就把它扔掉了
因此,请这样做:
flag = queue.get()
if flag:
或者,更简单地说:
if queue.get():
我不确定这是否正是你想要的。该queue.get()
将永远阻塞,直到主进程将某些内容放入其中。这就是你想要的吗?如果是,那就太好了;您已经完成了这部分代码。如果不是,你需要考虑你想要什么
按照设计,家长将始终等待2秒钟,即使孩子在等待之前很久就完成了。更好的解决方案是在超时2秒的情况下加入子项。然后,如果超时,您可以终止它
另外,你确定你设计的终止行为是你想要的吗?您正在对队列执行“软杀戮请求”,然后等待2秒,然后对终止
执行“中硬杀戮请求”,而从不对杀戮执行“硬杀戮”。这可能是一个非常合理的设计,但如果不是您的设计,则说明您实现了错误的东西。谢谢您的建议。要提升标志
,我应该在queue.put()中放入什么?现在我已经尝试了你的建议,没有创建h5文件。标志
就是你所说的queue.put()
。因此,如果希望它生成文件,您可以put(True)
;如果希望它跳过生成,您可以put(False)
。但是如果你在两秒钟后终止这个过程,而孩子还没有到达那个点,那么这个标志就无关紧要了。如果这两秒钟是你愿意等待多长时间的实际超时,那就是正确的行为。