我在python中编写了一个多线程解压缩程序.每个线程都需要访问输入文件的不同块.
注1:无法加载整个文件,因为它的范围从15 Gb到200 Gb; 我不是使用多线程来加速数据读取,而是数据解压缩,我只是想确保数据读取不会减慢解压缩速度.
注2:GIL不是问题,这里,因为主解压缩器函数是C扩展,它调用Py_ALLOW_THREADS,因此在解压缩时释放GIL.第二阶段减压使用numpy,也是无GIL的.
1)我假设它不能简单地共享一个Decompressor对象(基本上包装文件对象),因为如果线程A调用以下内容:
decompressor.seek(x)
decompressor.read(1024)
Run Code Online (Sandbox Code Playgroud)
并且线程B也是这样,线程A可能最终从线程B偏移读取.它是否正确?
2)现在我只是让每个线程创建自己的Decompressor实例,它似乎工作,但我不确定这是最好的方法.我考虑过这些可能性:
添加类似的东西
seekandread(from_where, length)
Run Code Online (Sandbox Code Playgroud)
到解压缩器类获取锁,寻找,读取和释放锁;
创建一个等待读取请求并以正确顺序执行它们的线程.
那么,我错过了一个明显的解决方案吗?这些方法之间是否存在显着的性能差异?
谢谢
或者更一般地说,如果在这样的内核上执行带有操作码!= 0的swi指令会发生什么?它会产生信号吗?我问,因为我想陷阱.