正如我们所看到的,在 HTTP膳绫擎获取一个URL中,这些线程在等待每个套接字操作时放弃 GIL,所以他们比一个线程更快完成工作。
Parallelism 并行
如不雅想只经由过程同时运行 Python 代码,而使义务完成更快怎么办?这种方法称为并行,这种情况 GIL 是禁止的。你必须应用多个过程,这种情况比线程更复杂,须要更多的内存,但它可以更好应用多个 CPU。
这个例子 fork 出 10 个过程,比只有 1 个过程要完成更快,因为过程在多核中并交运行。然则 10 个线程与 1 个线程比拟,并不会完成更快,因为在一个时光点只有 1 个线程可以履行 Python:
- import os
- import sys
- nums =[1 for _ in range(1000000)]
- chunk_size = len(nums) // 10
- readers = []
- while nums:
- chunk, nums = nums[:chunk_size], nums[chunk_size:]
- reader, writer = os.pipe()
- if os.fork():
- readers.append(reader) # Parent.
- else:
- subtotal = 0
- for i in chunk: # Intentionally slow code.
- subtotal += i
- print('subtotal %d' % subtotal)
- os.write(writer, str(subtotal).encode())
- sys.exit(0)
- # Parent.
- total = 0
- for reader in readers:
- subtotal = int(os.read(reader, 1000).decode())
- total += subtotal
- print("Total: %d" % total)
因为每个 fork 的过程有一个零丁的 GIL,这个法度榜样可以把工作分派出去,并一次运行多个计算。
所以,尽管有 GIL,你仍然须要加锁来保护共享的可变状况:
结语
既然你已经打开了音乐盒,看到了它简单的装配,你明白所有你须要知道的若何写出快速运行,线程安然的 Python 代码。应用线程进行并发 I/O 操作,在过程中进行并行计算。这个原则足够简单,你甚至不须要把它写在你的手上。
奇怪的是,我写 Python 法度榜样多年,一向对全局说冥器锁(GIL)持出缺点的不雅念,因为我大年夜未对它的运作机理产生足够好奇。我碰到其他对此同样迟疑和蒙昧的人。是时刻让我们来打开这个盒子一窥毕竟了。让我们解读 CPython 说冥器源码,找出 GIL 毕竟是什么,为什么它存在于 Python 中,它又是怎么竽暌拱响多线程法度榜样的。我精晓过举例赞助你深刻懂得 GIL 。你将会学到若何写出快速运行和线程安然的 Python 代码,以及如安在线程和过程中做选择。
【编辑推荐】
- 深刻Python字典的内部实现
- 10款Web开辟最佳的Python框架
- Python爬虫爬取知乎小结
- 深刻Python列表的内部实现
- 应用Python供给高机能计算办事
推荐阅读
中断产生,并由中断导致的宕机,将导致云用户的收入受损。这些故障也可能对企业的荣誉产生晦气影响,即使问题已经解决了几个礼拜或几个月。比拟于本地基本架构,公有云计算平日会削减企业>>>详细阅读
本文标题:深入理解GIL:如何写出高性能及线程安全的Python代码
地址:http://www.17bianji.com/lsqh/35440.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示