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

标签 python queue multiprocessing h5py

我在用 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/

相关文章:

python - 如何使用授权类型为 'Client Credentials' 的请求 OAuthlib ?

python - 如何在 Python 中使用模拟文件对象进行单元测试?

python multiprocess.Pool 在标准输出中按顺序显示结果

python - Django 测试 : Got an error creating the test database: database "database_name" already exists

python - 如何使用 python selenium 点击第一个谷歌搜索结果?

java - ProrityQueue 的奇怪行为

javascript - 在当前触发期间停止触发 jQuery 事件?

python - 如何在 python 中为 multiprocessing.Queue 实现 LIFO?

windows - Python 3.2 Multiprocessing.Process 未运行目标函数

python - 在函数内部使用时 `.append` 和 `+=` 之间的区别