【问题标题】:Python multiprocessing.dummy and deepdish don't work togetherPython multiprocessing.dummy 和 deepdish 不能一起工作
【发布时间】:2018-03-11 01:52:24
【问题描述】:

multiprocessing.dummy 包和deepdish 写入压缩的 h5 文件时遇到问题。 这就是我正在做的事情:

import deepdish as dd
from multiprocessing.dummy import Pool

def writeThings(args):
    path, np_array = args
    dd.io.save(path, {'arr': np_array}, compression='blosc')

p = Pool(4)
p.map(writeThings, all_np_arrays_and_paths)

当我注释掉 deepdish save 命令时,一切正常。 似乎 dd 在 Windows 上创建了一种损坏的文件,Python 检测到了这个错误,然后就崩溃了。有谁知道如何解决这一问题?非常感谢。

【问题讨论】:

  • 错误信息会很有帮助。您是否尝试过包装方法调用以将数据保存在异常处理程序中?
  • 其实没有错误信息。 Python存在异常代码1073741819,搜索后发现有一个写h5文件有问题。

标签: python python-multiprocessing hdf5 h5py


【解决方案1】:

为了澄清,路径彼此不同,所以我写入不同的文件。但是,这个 simple 功能仍然不起作用。但是,如果我将它嵌入到具有锁的threading.Thread 类中并用lock.acquire 包围dd.io.save 命令,并且在写入文件lock.release 之后一切正常。

这里给大家一个代码sn-p:

import threading

class writeThings(threading.Thread):
    def __init__(self, args, lock):
        super().__init__()
        self.args = args
        self.lock = lock

    def run(self):
        while self.args:
            path, np_array = self.args.pop()
            # Give this thread unique writing rights
            self.lock.acquire()
            dd.io.save(path, {"arr": np_array}, compression='blosc')
            self.lock.release()

lock = threading.Lock()
n_threads = 4
threads = []

for i in range(n_threads):
    threads.append(writeThings(args_junk[i],lock))

for i in range(n_threads):
    threads[i].start()

for i in range(n_threads):
    threads[i].join()

【讨论】:

    猜你喜欢
    • 2021-11-29
    • 2016-01-01
    • 1970-01-01
    • 2011-07-29
    • 2014-01-07
    • 2019-08-17
    • 2016-11-23
    • 2019-02-18
    • 2015-05-16
    相关资源
    最近更新 更多