1

我已经使用python Queues建立了生产者/消费者模型。在一个制作人中,我使用scipy.misc.imread阅读图像。scipy.misc.imread安全/高效地从多线程运行?

在一个线程读取图像不够快,它需要0.2秒〜每幅图像阅读。从SSD读取约20MB /秒。

我尝试添加使用Python的threading模块另一个相同的线程。然而,在scipy.misc.imread中花费的时间增加了大约两倍,导致2个线程读取图像的速度大约与1相同。

我敢肯定,我的SSD可以处理40MB /秒的吞吐量,即使随机读取。 A dd写入测试显示800MB + /秒写入速度。

我在想,如果scipy.misc.imread运行的线程之间的临界区域?我期望multiprocessing可以避免这个问题吗?

+0

'scipy.misc.imread'只是PIL周围的薄包装。图像有多大?他们在什么格式(特别是他们压缩)? –

+0

另外,您安装了哪个版本的PIL?它是枕头叉,还是原始的PIL库?直到[this commit](https://github.com/python-pillow/Pillow/pull/1224),Pillow/PIL在图像解码过程中没有释放GIL。我没有来源,但我猜想原始PIL也不会释放GIL。 –

+0

我使用的是Anaconda,所以无论版本如何。我已经运行了多处理的第一个测试,它似乎没有相同的问题,我必须运行更多的测试来确保我的眼睛不会欺骗我。图像是每个2MB,我需要读取并以20图像/秒的速度排队。 –

回答

0

scipy.misc.imread是从多个线程安全的,但每次通话锁定全局解释,因此性能将不会从多线程中获益。

它运作良好的多,不出意外的问题。