file.read()多处理和GIL

时间:2012-08-31 10:58:23

标签: python multiprocessing 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)

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

2 个答案:

答案 0 :(得分:2)

我认为这是你问题的主要部分:

  

问题是我是否理解这一点,我会变得更好   读取的性能保留在主进程中或单独进行   一个?

我假设您的目标是尽快阅读和处理文件。文件读取在任何情况下都是I / O绑定而不是CPU绑定。您无法以比能够读取数据更快的速度处理数据。因此,文件I / O明显限制了软件的性能。通过使用并发线程/进程进行文件读取,无法提高读取数据速率。 “低级别”CPython也没有这样做。只要你在一个进程或线程中读取文件(即使CPython的GIL线程很好),你每次都可以从存储设备获得尽可能多的数据。如果你在主线程中执行文件读取也没有问题,只要没有其他阻塞调用实际上会减慢文件读取速度。

答案 1 :(得分:1)

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

Does (C)Python create threads on its own, and if so, how can I make use of that?

简短回答:否。

但是,这些C函数对Python程序员来说仍然很有趣的原因如下。默认情况下,在同一个解释器中运行的两个python代码片段不能并行执行,这是由于名为全局解释器锁的邪恶,也就是GIL。只要解释器​​执行Python代码(即上述语句),就不会在同一个解释器中并行运行两个python代码。

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

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