我正在将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之外进行调用,有效地获得与多处理相同的结果,但开销要小得多。你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐