2012-08-31 47 views
4

我读过,在C,实施一定的Python函数,我假定包括file.read(),可以释放GIL,当他们工作,然后拿回来上完成通过这样做可以使用多个内核。file.read()多和GIL

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

现在,如果我理解这个权利,似乎创造一个新的进程来读,因为我目前做的是uneccessary的文件,我应该把它的主要工序。问题是我是否理解这一权利,并且在主流程中还是单独保存的情况下,我是否会获得更好的性能?

所以给我的函数读取和管道的数据进行处理:

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) 

任何见解有人有哪个人会是将不胜感激更快,是因为什么原因!

+0

你为什么不试试,这是更快,并在主进程中读取时是否使用多核心? – bpgergo

+1

你将不得不实际创建一个线程。只是调用''read(* args)''将不会执行任何线程(对不起,如果你知道这一点,在你的问题上有点不清楚)。 –

+0

@Jonas这是我的理解;没有显式创建线程意味着没有创建线程......但是我所做的研究使我相信CPython在某些情况下可以创建自己的线程来执行低级别的事情,尽管它们不会暴露给API。我不禁感到我误解了某个地方的某些东西,这就是为什么我有兴趣获得更好的理解。 – redrah

回答

1

好吧,由批示就出来了,实际的问题是:

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

简短的回答:

,为什么这些C-功能是原因但对Python程序员来说有趣的是以下内容。默认情况下,在同一个解释器可以并行执行运行Python代码没有两个片段,这是由于所谓的全局解释锁邪恶,又名GIL。的GIL是每当解释器执行Python代码,这意味着上面的语句,没有两个的Python代码块可以在相同的解释器并行运行保持。尽管如此,你仍然可以在python中使用多线程,也就是当你在做大量的I/O或者大量使用像numpy,scipy,lxml等外部库时,它们都知道关于这个问题,只要他们可以发布GIL(即不需要与python解释器交互),就释放GIL。

我希望清理的问题有点。

+0

所以在我最初的例子中,我会更好地使用'threading.thread(read)'over'multiprocessing',因为在file.read()中完成的大部分工作将由GIL发布完成,因此将会能够利用多个核心? – redrah

+0

它可以更好。如果不知道你的整个计划,这将很难说。如果发生任何同步(因为您不共享_all_内存),多处理通常具有较大的同步开销,但多线程对于python而言更为昂贵。你真的应该只用它做一个测试。进行一些基准测试设置,可能通过FIFO进行伪造的慢速输入,然后测试两种模型。 Afaik可以互换使用'multi(processing thread)''模块。 –

2

我觉得这是你的问题的主要部分:

问题是我该理解这个权利,我会得到更好的 性能保持在主过程中或在单独 一个读?

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