作家
登录

深入理解GIL:如何写出高性能及线程安全的Python代码

作者: 来源: 2017-05-26 11:06:13 阅读 我要评论

正如我们所看到的,在 HTTP膳绫擎获取一个URL中,这些线程在等待每个套接字操作时放弃 GIL,所以他们比一个线程更快完成工作。

Parallelism 并行

如不雅想只经由过程同时运行 Python 代码,而使义务完成更快怎么办?这种方法称为并行,这种情况 GIL 是禁止的。你必须应用多个过程,这种情况比线程更复杂,须要更多的内存,但它可以更好应用多个 CPU。

这个例子 fork 出 10 个过程,比只有 1 个过程要完成更快,因为过程在多核中并交运行。然则 10 个线程与 1 个线程比拟,并不会完成更快,因为在一个时光点只有 1 个线程可以履行 Python:

  1. import os 
  2.  
  3. import sys 
  4.  
  5. nums =[1 for _ in range(1000000)] 
  6.  
  7. chunk_size = len(nums) // 10 
  8.  
  9. readers = [] 
  10.  
  11. while nums: 
  12.  
  13.     chunk, nums = nums[:chunk_size], nums[chunk_size:] 
  14.  
  15.     reader, writer = os.pipe() 
  16.  
  17.     if os.fork(): 
  18.  
  19.         readers.append(reader)  # Parent. 
  20.  
  21.     else
  22.  
  23.         subtotal = 0 
  24.  
  25.         for i in chunk: # Intentionally slow code. 
  26.  
  27.             subtotal += i 
  28.  
  29.         print('subtotal %d' % subtotal) 
  30.  
  31.         os.write(writer, str(subtotal).encode()) 
  32.  
  33.         sys.exit(0) 
  34.  
  35. # Parent. 
  36.  
  37. total = 0 
  38.  
  39. for reader in readers: 
  40.  
  41.     subtotal = int(os.read(reader, 1000).decode()) 
  42.  
  43.     total += subtotal 
  44.  
  45. print("Total: %d" % total)  

因为每个 fork 的过程有一个零丁的 GIL,这个法度榜样可以把工作分派出去,并一次运行多个计算。

所以,尽管有 GIL,你仍然须要加锁来保护共享的可变状况:

结语

既然你已经打开了音乐盒,看到了它简单的装配,你明白所有你须要知道的若何写出快速运行,线程安然的 Python 代码。应用线程进行并发 I/O 操作,在过程中进行并行计算。这个原则足够简单,你甚至不须要把它写在你的手上。

奇怪的是,我写 Python 法度榜样多年,一向对全局说冥器锁(GIL)持出缺点的不雅念,因为我大年夜未对它的运作机理产生足够好奇。我碰到其他对此同样迟疑和蒙昧的人。是时刻让我们来打开这个盒子一窥毕竟了。让我们解读 CPython 说冥器源码,找出 GIL 毕竟是什么,为什么它存在于 Python 中,它又是怎么竽暌拱响多线程法度榜样的。我精晓过举例赞助你深刻懂得 GIL 。你将会学到若何写出快速运行和线程安然的 Python 代码,以及如安在线程和过程中做选择。

【编辑推荐】

  1. 深刻Python字典的内部实现
  2. 10款Web开辟最佳的Python框架
  3. Python爬虫爬取知乎小结
  4. 深刻Python列表的内部实现
  5. 应用Python供给高机能计算办事
【义务编辑:枯木 TEL:(010)68476606】

  推荐阅读

  公有云账单:忽略这四项成本,后果很严重!

中断产生,并由中断导致的宕机,将导致云用户的收入受损。这些故障也可能对企业的荣誉产生晦气影响,即使问题已经解决了几个礼拜或几个月。比拟于本地基本架构,公有云计算平日会削减企业>>>详细阅读


本文标题:深入理解GIL:如何写出高性能及线程安全的Python代码

地址:http://www.17bianji.com/lsqh/35440.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)