使用ctypes和多线程绕过Python GIL在多线程函数中混合Python代码的效果

2024-03-28 12:35:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在将python中的一些函数调用并行化到一个外部c++dll,该dll是通过ctypes调用的。你知道吗

我知道在python中,GIL可以通过外部调用来打破,即使不是使用多处理,而是多线程(参见example

import ctypes  
import ctypes.util  
import threading  
import time  

testname = ctypes.util.find_library('test')  
testlib = ctypes.cdll.LoadLibrary(testname)  

test = testlib.test  
test.argtypes = [ctypes.c_int, ctypes.c_int]  

def t():  
  test(0, 1000000000)  

if __name__ == '__main__':  
  start_time = time.time()  
  t()  
  t()  
  print "Sequential run time: %.2f seconds" % (time.time() - start_time)  

  start_time = time.time()  
  t1 = threading.Thread(target=t)  
  t2 = threading.Thread(target=t)  
  t1.start()  
  t2.start()  
  t1.join()  
  t2.join()  
  print "Parallel run time: %.2f seconds" % (time.time() - start_time)  

我的问题是,如果我开始在def t()函数中混合python代码,会发生什么?似乎发生的是,函数的执行速度甚至比根本不使用任何多线程还要慢。有没有可能这会使gil陷入僵局?如有任何建议,我们将不胜感激。你知道吗

澄清一下,我知道我可以使用多处理,但在我的情况下,这将是非常低效的,因为每个进程必须加载的数据量非常大。这就是为什么我需要利用使用多线程的可能性,并在python之外进行调用,有效地获得与多处理相同的结果,但开销要小得多。你知道吗


Tags: testimporttimedefutilctypesstartint