python – file.read()多处理和GIL

我已经读过用C实现的某些Python函数,我假设它们包含了file.read(),可以在它们工作时释放GIL,然后在完成后重新启动它,这样做可以使用多个内核,如果它们’可用.

我正在使用多进程来并行化一些代码,目前我有三个进程,父进程,一个从文件中读取数据的子进程,以及一个从第一个子进程传递给它的数据生成校验和的子进程.

现在,如果我理解这一点,似乎创建一个新的进程来读取我正在进行的文件是不必要的,我应该在主进程中调用它.问题是我是否理解这一点,并且通过主流程或单独的流程中的读取,我能获得更好的性能吗?

因此,我的函数是读取和管道要处理的数据:

def read(file_path, pipe_out):
    with open(file_path, 'rb') as file_:
        while True:
            block = file_.read(block_size)
            if not block:
                break
            pipe_out.send(block)
    pipe_out.close()

我认为这肯定会使用多个内核,但也会引入一些开销:

multiprocess.Process(target=read, args).start()

但现在我想知道这样做是否也会使用多个内核,减去开销:

read(*args)

任何人都有任何见解,哪一个会更快,出于什么原因将非常感谢!

解决方法:

好的,正如评论所说,实际的问题是:

(C)Python是否自己创建线程,如果是,我该如何利用它呢?

简答:不.

但是,这些C函数对Python程序员来说仍然有趣的原因如下.默认情况下,在同一个解释器中运行的两个python代码片段不能并行执行,这是由于称为全局解释器锁(又称GIL)的邪恶.每当解释器执行Python代码时都会保持GIL,这意味着上面的语句,在同一个解释器中没有两个python代码可以并行运行.

不过,你仍然可以在python中使用多线程,即当你做了很多I / O或者大量使用numpy,scipy,lxml等外部库时,这些都知道这个问题,尽可能释放GIL(即每当他们不需要与python解释器交互时).

我希望能稍微解决这个问题.

上一篇:zipfile.BadZipFile: File is not a zip file


下一篇:编写快速且线程安全的Python代码