作家
登录

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

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

 

一行被编译成 3 个字节码:

  1. 将 lst 值加载到客栈上
  2. 将其排序办法加载到客栈上
  3. 调用排序办法

尽管 GIL 不克不及免除我们加锁的须要,但它确切意味着没有加细粒度的锁的须要(所谓细粒度是指法度榜样员须要自行加、解锁来包管线程安然,典范代表是 Java , 而 CPthon 中是粗粒度的锁,即竽暌癸言层面本身保护着一个全局的锁机制,用来包管线程安然)。在线程自由的说话比如 Java,法度榜样员尽力在尽可能短的时光内加锁存取共享数据,减轻线程争夺,实现最大年夜并行。然而因为在 Python 中线程无法并交运行,细粒度锁没有任何优势。只要没有线程保持这个锁,比如在睡眠,等待I/O, 或者一些其他掉去 GIL 操作,你应当应用尽可能粗粒度的,简单的锁。其他线程无论若何无法并交运行。

并发可以完成更快

我敢打赌你真正为的是经由过程多线程来竽暌古化你的法度榜样。经由过程同时等待很多收集操作,你的义务将更快完成,那么多线程会起到赞助,即使在同一时光只有一个线程可以履行 Python 。这就是并发,线程在这种情况下工作优胜。

  1. for (;;) { 
  2.  
  3.     if (--ticker < 0) { 
  4.  
  5.         ticker = check_interval; 
  6.  
  7.   
  8.  
  9.         /* Give another thread a chance */ 
  10.  
  11.         PyThread_release_lock(interpreter_lock); 
  12.  
  13.   
  14.  
  15.         /* Other threads may run now */ 
  16.  
  17.   
  18.  
  19.         PyThread_acquire_lock(interpreter_lock, 1); 
  20.  
  21.     } 
  22.  
  23.   
  24.  
  25.     bytecode = *next_instr++; 
  26.  
  27.     switch (bytecode) { 
  28.  
  29.         /* execute the next instruction ... */ 
  30.  
  31.     } 
  32.  
  33.  

线程中代码运行更快

  1. import threading 
  2.  
  3. import requests 
  4.  
  5. urls = [...] 
  6.  
  7. def worker(): 
  8.  
  9.     while True
  10.  
  11.         try: 
  12.  
  13.             url = urls.pop() 
  14.  
  15.         except IndexError: 
  16.  
  17.             break  # Done. 
  18.  
  19.         requests.get(url) 
  20.  
  21. for _ in range(10): 
  22.  
  23.     t = threading.Thread(target=worker) 
  24.  
  25.     t.start()  

  26.   推荐阅读

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

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


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

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

关键词: 探索发现

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

网友点评
自媒体专栏

评论

热度

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