首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python多线程读取只读内存缓冲区绕过GIL

python多线程读取只读内存缓冲区绕过GIL
EN

Stack Overflow用户
提问于 2016-11-01 12:34:24
回答 2查看 952关注 0票数 0

我有很多文件在磁盘上需要读取,第一个选项是使用多线程,它在固态硬盘上执行得很好。(当线程被IO阻塞时,它将释放GIL)

但我想在没有固态硬盘的情况下达到类似或更快的速度,所以我将它们预先加载到内存中(就像存储在字典中一样),每个线程都会从内存中读取每个文件内容。不幸的是,也许是因为GIL,在dict中有一个锁,因此它的速度甚至比从SSD加载文件还要慢!

所以我的问题是,有没有任何解决方案可以创建一个没有锁/GIL的只读内存缓冲区?像内存磁盘或else>之类的东西

EN

回答 2

Stack Overflow用户

发布于 2016-11-01 12:53:06

简而言之,不是。

尽管Python (特别是CPython)是一种多线程语言,但解释器在任何时刻都只能运行一段python代码。因此,如果您的纯python程序不包含阻塞I/O (例如,访问无锁内存缓冲区),那么无论您做什么,它都会降低单线程程序的性能。实际上,与实际的单线程程序相比,性能会更差,因为与其他线程的同步存在开销。

(特别感谢Graham Dumpleton!)其中一个solution就是为CPython编写C扩展。并在进入“C领域”时释放GIL。请注意,如果没有GIL保护,您不能访问python内容,否则它将导致细微的bug,或者直接崩溃。

有几个实现不使用GIL,例如,Jython和Cython (不是CPython)。您可以尝试使用它们。但请记住,编写正确的多线程程序是困难的。编写一个快速的多线程程序就更难了。我的建议是写多进程程序而不是多线程。并通过IPC或类似的方式传递数据(比如ZeroMQ,它很容易使用,而且很轻量级)。

票数 1
EN

Stack Overflow用户

发布于 2016-11-16 20:54:56

让我在@HKTonyLee的回答中补充几点。

所以Python有这个GIL。但在执行例如文件I/O时,它会被释放。这意味着您可以并行读取文件。由于从进程的角度来看,没有文件,只有文件描述符(假设是posix),那么您读取的任何内容都不必存储在磁盘上。

总而言之,如果你移动你的文件到(例如) tmpfs或内存磁盘或任何类似的地方,那么你应该比使用固态硬盘获得更好的性能。但是要注意风险:如果你需要修改文件,你可能会丢失更新。

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

https://stackoverflow.com/questions/40354183

复制
相关文章

相似问题

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