技术分享 《python gil的那些事儿》

      前段时间一个老友叫我过去做一场技术分享,盛情难却,又有大保健做挟持,不得已还是要花点心思来准备一下。  我承认自己是一个不善于演讲的人,时常会感到词穷,激动的场景下话题有些偏离。 我知道自己这个缺点,所以一直在克服它。  这里也建议大家多做一些分享活动,哪怕技术分享也可以,有锻炼人的目的。    我在youtube也会看到一些大牛的视频,平时在邮件list里面,呼风唤雨,一到演讲,….  你懂的。 另外准备分享的过程也是相当的磨人,尽量万无一失,别让人给灭了。   记得好几年前,有一次去蓝汛开开心心的做分享,沈灿跟我那边不是太懂,结果冒出几个人把我给收拾了…. 很尴尬…   

     其实原本是选定了几个主题《小谈redis的设计》或者 《聊运维平台化》。 但关于运维自动化因他们工作中不涉及,所以没啥兴趣 。 关于redis主题是说,上个月他们已经有两次的redis分享….    正好我上周刚在公司分享的 《异步IO调度器的实现》 …   结果说,他们底层后端, 时常会有人分享 epoll 及高性能服务开发主题 。 那我还是消停点吧,别让那些专门写服务端的人给灭了。  

       这nima三下两下的,搞得哥都不愿意去了 ,哥还是遵守了礼尚往来,上次哥也把他给坑了.   禁不住请客大保健的诱惑 (其实就撸个串) , 还是做了这次的技术分享。  这是一家实力较厚的韩国互联网公司,地位类似于中国的bat。 我花了心思准备的PPT,理所当然吹牛的过程很是顺利,跟那帮工程师也挺融洽的。 话说,韩国的Python市场也不少,跟那韩国人闲扯了会,得知在韩国IT,现在的年轻人学python、ruby的越来越多,pyhton几乎是第二语言的必选。 应用的场景跟中国差不多,纯后端的,web开发的,ops的….  

 

    记得上个月帮一个朋友面试一高级工程师,偶尔问道他对python gil全局锁的理解,这哥们的回复有些简略。 后来跟同事聊了下,发现他们对gil理解也是有些偏差。 正好这次朋友也让我做一个稍微有深度点的python技术主题分享,我就聊gil这个话题了。   gil是个有意思的话题,大多数的pythoner都知道有gil这么一个东西,但不熟悉他的运行流程。 


该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新. http://xiaorui.cc/?p=3403

 关于内容先放出ppt 、 pdf ,  等朋友把视频录像整理完后,扔到youtube上供大家批评。 

摘要内容:

#xiaorui.cc

1. gil那些事儿 峰云就她了 http://xiaorui.cc
2. 相关 什么是python解释器 CPython vs pypy vs Jython
3. gil 什么是 Global Interpreter Lock Python为什么会有gil gil的优缺点 关于gil的历史
4. Thread A Thread B O| | | | | | |-1 1. get the current length 2. check if there’s room for more 3. Append element 4. Incrment the length by 1
5. Python’ s 线程 python线程是系统线程的. POSIX threads (pthreads) Windows threads 受内核来调度并切换上下文
6. 性能对比 def go_count(n): while n > 0: n -= 1 COUNT = 100000000 # 100 million go_count(COUNT) t1 = Thread(target=go_count,args=(COUNT//2,)) t2 = Thread(target=go_count,args=(COUNT//2,)) t1.start(); t2.start() t1.join(); t2.join() thread only thread two cost 10s cost 21s
7. 那么问题来了 多线程为什么比单线程还慢 ? python解释器运行原理 只有一个线程在running 多线程acquire lock的消耗成本
8. gil 简单描述: 拿到gil锁,谁就可以running , 当释放gil, send signal 没拿到gil锁, 休眠. 内核调度到你, 你如果没锁, sleep and wait for a signal 什么时候释放锁: IO Block every 100 tick force, default gil 是mutex + semaphore + condition
9. check_connection(self); Py_BEGIN_ALLOW_THREADS r = mysql_real_query(&(self->connection), query, len); Py_END_ALLOW_THREADS _mysql.c gil process
10. scheduler I/O I/O I/O I/O I/O run run run run acquire release acquire release acquire release release acquire
11. scheduler counter c h e c k run 100 ticks run 100 ticks run 100 ticks acquire release release release acquire c h e c k c h e c k Change it using sys.setcheckinterval() acquire
12. what a check Periodic “check” is simple The currently running thread … reset the tick counter run signal handler if this is main thread relase the gil Reacquires the gil
13. A tick ? def go(): a = True for i in range(3): print i if a: print "xiaorui.cc" b = None c = 123
14. t2 100 5351 ENTRY t2 100 5351 ACQUIRE t2 100 5352 RELEASE t2 100 5352 ENTRY t2 100 5352 ACQUIRE t2 100 5353 RELEASE t1 100 5353 ACQUIRE t2 100 5353 ENTRY t2 38 5353 BUSY t1 100 5354 RELEASE t1 100 5354 ENTRY t1 100 5354 ACQUIRE t2 79 5354 RETRY t1 100 5355 RELEASE t1 100 5355 ENTRY t1 100 5355 ACQUIRE t2 73 5355 RETRY t1 100 5356 RELEASE t2 100 5356 ACQUIRE t1 100 5356 ENTRY t1 24 5356 BUSY t2 100 5357 RELEASE 进入临界区 获取锁 释放锁 没拿到锁 重新尝试
15. wake up Condition Variable 等待wake up的线程队列enqueue() dequeuesignal() thread 5 thread 3 thread 2 thread 7 thread 1
16. suspended 100 tciks check os signal wake release 不公平竞争 100 tciks check signal suspended 100 tciks T1 T2 thread cs ……
17. 不公平竞争 Thread A (cpu 1) 多核 Thread B (cpu 2) release gil acquire gil release gil acquire gil waked acquire gil (fail) waked acquire gil (fail) signale signale
18. suspended 100 tciks check new gil 100 tciks T1 T2 cv_wait(gil,TIMEOUT) timeout signale suspended 100 tciks gil_drop_request = 1 gil_drop_request = 0 cv_wait(gil,TIMEOUT)
19. 那么threading场景 由于有gil全局锁, python多线程的意义 ? IO 密集 CPU 密集 python的线程调度策略 再次声明,解释器没有thread调度器
20. 特例, Signal 当信号到达的时,解释器会按照每个tick都要check. 直到main thread处 理了signal.
21. 绕过gil multiprocessing python gil 存在于线程之间 ctypes 调用c函数之前, 会释放gil more … …
22. kill gil python能否去掉gil ? 如何实现python底层去gil ? 去掉之后又会出现什么 ? 总结: 值不值, 成本 ?
23. think 某个线程一直高比率拿到锁 ? t1时间片用完了, kernel把t2调度起来, 但gil还在t1手里 ? 多线程都在一个cpu core上 ?
24. “Q & A” –峰云就她了


PDF地址:

http://xiaorui.cc/python_gil.pdf

PPT地址:   

http://www.slideshare.net/rfyiamcool/python-gil

(放到slideshare.net上了,你如果看不到下面的ppt ,那你就需要翻墙了。 )

python gil from rfyiamcool

END.


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc

2 Responses

  1. dc 2016年6月6日 / 上午6:28

    ppt看不了呀

发表评论

邮箱地址不会被公开。 必填项已用*标注