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

2024-04-26 20:16:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个用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中而被及时传递给父进程。谢谢您。在


Tags: 数据fromimporttruedataifqueue进程
1条回答
网友
1楼 · 发布于 2024-04-26 20:16:58

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

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

queue.get()
if queue == True:

首先,你的queue永远不会是布尔值True,而是Queue。在Python中,您几乎不想检查if x == True:;而应该检查if x:。例如,if [1, 2]:将通过,而{}则不会。在

第二,你的queue根本不是你首先想要检查的东西。它不是真的或假的(或者不管它是否相关),而是主进程放在队列上的值,你成功了,这要么是真的,要么是假的。你一找到它就把它扔了。在

所以,这样做:

^{pr2}$

或者,更简单地说:

if queue.get():

我不确定这是否正是你想要的。这个queue.get()将永远阻塞,直到主进程在那里放置一些东西。这就是你想要的吗?如果是这样的话,那太好了;你已经完成了这部分代码。如果不是,你需要想想你想要什么。在

按照设计,父对象总是等待2秒,即使孩子在这之前完成了。一个更好的解决方案是join子进程超时2秒。如果超时,则可以terminate。在

另外,你确定你设计的终止行为是你想要的吗?您正在对队列执行“软终止请求”,然后等待2秒,然后使用terminate执行“中等硬终止请求”,而从不使用kill执行“硬杀死”。这可能是一个非常合理的设计,但如果不是你的设计,你已经实现了错误的事情。在

相关问题 更多 >