Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
能否将python多处理队列传递给子进程?_Python_Queue_Multiprocessing_H5py - Fatal编程技术网

能否将python多处理队列传递给子进程?

能否将python多处理队列传递给子进程?,python,queue,multiprocessing,h5py,Python,Queue,Multiprocessing,H5py,我在用python编写的数据采集系统中有一个大数据集,它需要无限长的时间才能将队列从子进程传递到父进程。我想保存采集结束时采集的数据,并使用多处理中的队列功能进行了尝试。如果我可以通过队列将一条消息从父进程传递给子进程,以便在终止子进程之前保存数据,而不是这样做,我更希望这样做。这可能吗?我认为它可能是这样的一个例子是: def acquireData(self, var1, queue): import h5py # Put my acquisition code here

我在用python编写的数据采集系统中有一个大数据集,它需要无限长的时间才能将队列从子进程传递到父进程。我想保存采集结束时采集的数据,并使用
多处理
中的
队列
功能进行了尝试。如果我可以通过
队列
将一条消息从父进程传递给子进程,以便在终止子进程之前保存数据,而不是这样做,我更希望这样做。这可能吗?我认为它可能是这样的一个例子是:

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)
。但是如果你在两秒钟后终止这个过程,而孩子还没有到达那个点,那么这个标志就无关紧要了。如果这两秒钟是你愿意等待多长时间的实际超时,那就是正确的行为。