python结合lua打破GIL的限制

GIL(Global Interpreter Lock):全局解释器锁,python解释器在执行python字节码的时候会锁住解释器,导致其它的线程不能使用解释器,从而多线程情况下CPU上不去。

关于GIL更详细的解释可以看这篇文章http://www.dabeaz.com/python/UnderstandingGIL.pdf,可能需要


python中由于有GIL的存在,CPU密集型的程序不能达到良好的效果,但是最近学习lua的时候,想到如果python执行的不是python字节码是不是可以突破GIL的限制,实验一番以后果然有惊喜。


import lupa

lua_code = '''
    function(idx, N)
        for i = 1, N do
            if i % 10000000 == 0 then
                print(idx, i)
            end
        end
    end
'''

old = time.time()
lua_funcs = [lupa.LuaRuntime().eval(lua_code) for _ in range(3)]
def wrapper(idx, N, lua_func):
    lua_func(idx, N)
    
import threading
threads = [threading.Thread(target=wrapper, args=(idx, 1000000000, lua_func))
    for idx, lua_func in enumerate(lua_funcs)]
for thread in threads:
    thread.start()
for thread in threads:
    thread.join()
print time.time() - old

lupa是一个python调用lua的第三方库(https://pypi.python.org/pypi/lupa),lua_code是一段纯CPU计算的lua代码片段,之后开启了3个线程,可以发现CPU利用率达到了300%


之前在写一些python程序的时候,如果是cpu密集的常常会使用多进程的方式,但是这样会有一些缺点:

1. 进程间共享数据特别麻烦,虽然multiprocessing库提供了很多进程间共享数据的方法,但是这些方法最后自己会成为瓶颈

2. 编程复杂度比较高

3. 主进程和子进程必然需要通信,进程间数据隔离,所以数据需要内存拷贝,成本高


如果改为python加lua的方式应该会有更好的性能以及更低的编程复杂度。

你可能感兴趣的:(python,lua)