Python中pypy日常:我们要干掉GIL
Pypy:我们想要干掉 GIL,基于之前募集的 STM 剩余的钱,但是还不够,请大家捐款。
https://morepypy.blogspot.com/2017/08/lets-remove-global-interpreter-lock.html
Python中pypy日常:我们要干掉GIL
要是可以干掉 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?
grumpy
youtube 那确实是性能问题,但是大部分用 python 没有那么大的并发啊
pypy 目前最重要的是要突破 cpyext 的瓶颈, 这样才会有人采用
干掉 guido, 换委员会 /社区领导, py 才有希望啊 哈哈哈哈
那次尝试距现在都 20 年了
pypy 不是使用 gc 来回收内存的么?那么如果不再使用 refcount 来回收内存的话,多线程同时访问相同数据只会不一致,但是不会挂,只要在 gc 的时候加全局锁控制,那么移除 gil 还是有可能的吧


