Python中pypy日常:我们要干掉GIL

Pypy:我们想要干掉 GIL,基于之前募集的 STM 剩余的钱,但是还不够,请大家捐款。

https://morepypy.blogspot.com/2017/08/lets-remove-global-interpreter-lock.html
Python中pypy日常:我们要干掉GIL

19 回复

要是可以干掉 Cpython 的 GIL 我会捐款的


PyPy确实在努力解决GIL问题,但“干掉GIL”这个说法不太准确。PyPy的JIT编译器在某些场景下能显著提升性能,但它仍然有GIL。真正无GIL的Python实现是像Jython或IronPython这样的,但它们生态不行。

如果你想要绕过GIL做CPU密集型并发,还是得用多进程。比如用multiprocessing模块:

from multiprocessing import Pool
import math

def is_prime(n):
    if n < 2:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

if __name__ == '__main__':
    numbers = list(range(100000, 101000))
    
    with Pool() as pool:
        results = pool.map(is_prime, numbers)
    
    primes = [n for n, is_p in zip(numbers, results) if is_p]
    print(f"Found {len(primes)} primes")

这个例子用进程池并行判断质数,每个进程有自己的Python解释器和内存空间,完全避开了GIL。

对于I/O密集型任务,用asyncio就行,GIL影响不大:

import asyncio
import aiohttp

async def fetch_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return await response.text()

async def main():
    urls = ['http://httpbin.org/get'] * 10
    tasks = [fetch_url(url) for url in urls]
    results = await asyncio.gather(*tasks)
    print(f"Fetched {len(results)} pages")

asyncio.run(main())

总之,别指望PyPy能“干掉”GIL,该用多进程的时候还是得用。

总结:用多进程绕过GIL。

youtube 都在尝试把 python 用 go runtime 跑了,python runtime 真是令人无语,蛤蛤。

醒醒,别做梦了

pypy 真是牛的一 b 就是没钱,真苦。

你们尽管捐,去得成算我输

grumypy 那个项目提交很少了,基本是个 youtube 员工个人项目了。

本文的标题换成 STM is dead, Long live GIL. 更合适

都没听说 Gilectomy 吗?虽说也是个个人项目,不过因为是 core Dev 主导,社区讨论挺多的
https://us.pycon.org/2017/schedule/presentation/118/

直接 Jython

cpython 就是去了 GIL 性能还是太差,jit 才是未来。

那个东西没卵用,性能也不咋地。也是个大坑。目前还完全不可用

你说的是撒? golang?

youtube 那确实是性能问题,但是大部分用 python 没有那么大的并发啊

pypy 目前最重要的是要突破 cpyext 的瓶颈, 这样才会有人采用

干掉 guido, 换委员会 /社区领导, py 才有希望啊 哈哈哈哈

那次尝试距现在都 20 年了

pypy 不是使用 gc 来回收内存的么?那么如果不再使用 refcount 来回收内存的话,多线程同时访问相同数据只会不一致,但是不会挂,只要在 gc 的时候加全局锁控制,那么移除 gil 还是有可能的吧

回到顶部