我已经读过用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解释器交互时).
我希望能稍微解决这个问题.