首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >multiprocess.Queue.get()在python中需要很长时间

multiprocess.Queue.get()在python中需要很长时间
EN

Stack Overflow用户
提问于 2018-12-02 14:04:04
回答 1查看 318关注 0票数 2

我需要通过迭代数据来获取非常大的数据块。总之,我需要几百万次迭代。所以我原以为压制会加快我的进程,但它几乎做到了。我使用subprocess.Queue调用不同的线程,这实际上很好,但是当我调用*subprocess.Queue.get()时,程序需要花费很长时间才能得到结果。也许我做错了什么。下面是我的最小示例:

代码语言:javascript
复制
def get_losses(self, tags=None):
    return_dict = {}
    output_list = multiprocessing.Queue()
    process_list = []

    # Create quese definition
    for experiment, path in self.tf_board_dicts.items():
        t = multiprocessing.Process(target=self._load_vec_from_tfboard, args=(path, tags, experiment))
        process_list.append(t)
    print("Starting subprocesse with a total of {} workers. \n These are  {}".format(len(process_list),
                                                                                         process_list))
    # Run processes
    for p in process_list:
        p.start()

    # Exit the finished threads
    for p in process_list:
        p.join()
    print("All subprocesses are termianted")

    # Get results
    results = [output_list.get() for p in process_list]
    print("All losses are gathered: {}".format([tup[0] for tup in results]))

    # Create dict
    for experiment_losses in results:
         return_dict[experiment_losses[0]] = experiment_losses[1]

    return return_dict
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-14 17:19:36

您可以在这里找到无限时间队列问题的答案:Python Processes not joining

之所以会发生这种情况,是因为当大量数据被推入Queue时,它在内部使用缓冲区。在缓冲区被刷新之前,写入Queue的进程不能退出,这在您开始从Queue中提取东西之前是不会发生的。因此,因为在从写入的Queue对象中提取任何内容之前,您试图连接所有进程,所以它们无法退出,因此join挂起。您可以通过在进程上调用Queue之前耗尽join来解决这个问题。- dano 9月25日下午4:16

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53581000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档