一行被编译成 3 个字节码:
- 将 lst 值加载到客栈上
- 将其排序办法加载到客栈上
- 调用排序办法
尽管 GIL 不克不及免除我们加锁的须要,但它确切意味着没有加细粒度的锁的须要(所谓细粒度是指法度榜样员须要自行加、解锁来包管线程安然,典范代表是 Java , 而 CPthon 中是粗粒度的锁,即竽暌癸言层面本身保护着一个全局的锁机制,用来包管线程安然)。在线程自由的说话比如 Java,法度榜样员尽力在尽可能短的时光内加锁存取共享数据,减轻线程争夺,实现最大年夜并行。然而因为在 Python 中线程无法并交运行,细粒度锁没有任何优势。只要没有线程保持这个锁,比如在睡眠,等待I/O, 或者一些其他掉去 GIL 操作,你应当应用尽可能粗粒度的,简单的锁。其他线程无论若何无法并交运行。
并发可以完成更快
我敢打赌你真正为的是经由过程多线程来竽暌古化你的法度榜样。经由过程同时等待很多收集操作,你的义务将更快完成,那么多线程会起到赞助,即使在同一时光只有一个线程可以履行 Python 。这就是并发,线程在这种情况下工作优胜。
- for (;;) {
- if (--ticker < 0) {
- ticker = check_interval;
- /* Give another thread a chance */
- PyThread_release_lock(interpreter_lock);
- /* Other threads may run now */
- PyThread_acquire_lock(interpreter_lock, 1);
- }
- bytecode = *next_instr++;
- switch (bytecode) {
- /* execute the next instruction ... */
- }
- }
线程中代码运行更快
- import threading
- import requests
- urls = [...]
- def worker():
- while True:
- try:
- url = urls.pop()
- except IndexError:
- break # Done.
- requests.get(url)
- for _ in range(10):
- t = threading.Thread(target=worker)
- t.start()
推荐阅读
中断产生,并由中断导致的宕机,将导致云用户的收入受损。这些故障也可能对企业的荣誉产生晦气影响,即使问题已经解决了几个礼拜或几个月。比拟于本地基本架构,公有云计算平日会削减企业>>>详细阅读
本文标题:深入理解GIL:如何写出高性能及线程安全的Python代码
地址:http://www.17bianji.com/lsqh/35440.html
1/2 1

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