1.GIL 全局解释器锁:保证同一时刻只有一个线程在运行。

  什么是全局解释器锁GIL(Global Interpreter Lock)

  1. Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。
  2. Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。

  1)主线程死循环

  1. #主线程死循环,占满cpu
  2. while True:
  3. pass

    

  2)2个线程死循环

    

  1. #-*- coding:utf-8 -*-
  2. import threading
  3.  
  4. #子线程死循环
  5. def test():
  6. while True:
  7. pass
  8.  
  9. t1 = threading.Thread(target=test)
  10. t1.start()
  11.  
  12. #主线程死循环
  13. while True:
  14. pass

      

    

  • python中多线程实际是假的,效率还没有多进程高

  3)2个进程实现死循环

  1. import multiprocessing
  2.  
  3. def deadLoop():
  4. while True:
  5. pass
  6.  
  7. #子进程死循环
  8. p1 = multiprocessing.Process(target=deadLoop)
  9. p1.start()
  10.  
  11. #主进程死循环
  12. deadLoop()

    

2.C语言解决多线程下的GIL问题

  1)test.c 执行流程

  1. #include "stdio.h"
  2.  
  3. int main()
  4. {
  5. printf("hello world\n");
  6. return 0;
  7. }
  • gcc 生成a.out文件
  1. python@ubuntu:~/python06/06-GIL/01-用c语言来解决GIL问题$ gcc test.c
  2. python@ubuntu:~/python06/06-GIL/01-用c语言来解决GIL问题$ ls
  3. a.out test.c
  • ./a.out 执行程序
  1. python@ubuntu:~/python06/06-GIL/01-用c语言来解决GIL问题$ ./a.out
  2. hello world

  2)解决问题:循环用c语言来写

  1. ### read.me 文件
  2. 把一个c语言文件编译成一个动态库的命令(linux平台下):
  3. gcc xxx.c -shared -o libxxxx.so
  • 1.c语言写loop循环
  1. ### loop.c 文件
  2. void DeadLoop()
  3. {
  4. while(1)
  5. {
  6. ;
  7. }
  8. }
  • 2.执行命令生成库文件
  1. gcc loop.c -shared -o libdeadloop.so
  2.  
  3. .
  4. ├── libdeadloop.so
  5. ├── loop.c
  6. ├── main.py
  7. └── read.me
  • 3.加载动态库
  1. ### main.py 文件
  2. from ctypes import *
  3. from threading import Thread
  4.  
  5. #加载动态库
  6. lib = cdll.LoadLibrary("./libdeadloop.so")
  7.  
  8. #创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环
  9. t = Thread(target=lib.DeadLoop)
  10. t.start()
  11.  
  12. #主线程,也调用c语言编写的那个死循环函数
  13. #lib.DeadLoop()
  14.  
  15. while True:
  16. pass
  • 4.执行 python3 main.py ,查看多线程下的

    

3.htop top 实时进程查看器

  1. htop Linux系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台 或者X终端中),需要ncurses
  2.  
  3. Linux传统的top相比,htop更加人性化。它可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。

与top相比,htop有以下优点:

  • 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
  • 在启动上,比top 更快。
  • 杀进程时不需要输入进程号。
  • htop 支持鼠标操作。
  • top 已经很老了。

      

        

4.ps  一次性进程查看命令

  1. ps 命令就是最基本同时也是非常强大的进程查看命令。
  2.  
  3. 使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。
  4.  
  5. 总之大部分信息都是可以通过执行该命令得到的。
  6. ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。
  7. kill 命令用于杀死进程。

      

      

15 GIL 全局解释器锁 C语言解决 top ps的更多相关文章

  1. 【转】进程、线程、 GIL全局解释器锁知识点整理

    转自:https://www.cnblogs.com/alex3714/articles/5230609.html 本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线 ...

  2. Python之路-python(paramiko,进程和线程的区别,GIL全局解释器锁,线程)

    一.paramiko 二.进程.与线程区别 三.python GIL全局解释器锁 四.线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生 ...

  3. 10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁

    一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Pyt ...

  4. 网络编程之多线程——GIL全局解释器锁

    网络编程之多线程--GIL全局解释器锁 一.引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that preven ...

  5. GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调

    GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...

  6. python 并发编程 多线程 GIL全局解释器锁基本概念

    首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码. ...

  7. GIL全局解释器锁、死锁现象、python多线程的用处、进程池与线程池理论

    昨日内容回顾 僵尸进程与孤儿进程 # 僵尸进程: 所有的进程在运行结束之后并不会立刻销毁(父进程需要获取该进程的资源) # 孤儿进程: 子进程正常运行 但是产生该子进程的父进程意外死亡 # 守护进程: ...

  8. Python自动化 【第九篇】:Python基础-线程、进程及python GIL全局解释器锁

    本节内容: 进程与线程区别 线程 a)  语法 b)  join c)  线程锁之Lock\Rlock\信号量 d)  将线程变为守护进程 e)  Event事件 f)   queue队列 g)  生 ...

  9. 进程、线程与GIL全局解释器锁详解

    进程与线程的关系: . 线程是最小的调度单位 . 进程是最小的管理单元 . 一个进程必须至少一个线程 . 没有线程,进程也就不复存在 线程特点: 线程的并发是利用cpu上下文的切换(是并发,不是并行) ...

随机推荐

  1. Android(java)学习笔记11:生产者和消费者之等待唤醒机制

    1. 首先我们根据梳理我们之前Android(java)学习笔记70中,关于生产者和消费者程序思路: 2. 下面我们就要重点介绍这个等待唤醒机制: (1)第一步:还是先通过代码体现出等待唤醒机制 下面 ...

  2. ACM-ICPC(10 / 9)

    ACM-ICPC(10.9) 树形DP 树形DP考点很多,状态转移有时会很复杂,但是也有规律可寻,最重要的是抓住父子关系之间的状态转移. 树的最大独立集:尽量选择多的点,使得任何两个结点均不相邻.​ ...

  3. 使用cmd命令进行运行java(cmd命令输出Hello word)

    使用cmd命令输出Hello word 条件,按照好jdk和jre的环境下,如果没有安装,请安装,简单安装教程链接:https://www.cnblogs.com/weibanggang/p/9392 ...

  4. C# File流操作

    #region 文件读出 private void button1_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenF ...

  5. 【luogu P2146 [NOI2015]软件包管理器】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2146 变量名真毒瘤 我真的再也不把l,left,r,right弄反了 反向思维更好做一些 #include ...

  6. 12java基础继承

    26.定义类Human,具有若干属性和功能:定义其子类Man.Woman: 在主类Test中分别创建子类.父类和上转型对象,并测试其特性.   package com.hry.test; public ...

  7. 外部的 JavaScript

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  8. Ajax全接触(1)

    Ajax全称:Asynchronous JavaScript and XML(异步的JavaScript和XML) .Ajax不是某种编程语言 是一种在无需重新加载整个网页的情况之下能够更新部分网页的 ...

  9. Openresty最佳案例 | 第8篇:RBAC介绍、sql和redis模块工具类

    转载请标明出处: http://blog.csdn.net/forezp/article/details/78616738 本文出自方志朋的博客 RBAC介绍 RBAC(Role-Based Acce ...

  10. Unity 游戏框架搭建 (十一) 简易AssetBundle打包工具(一)

    最近在看Unity官方的AssetBundle(以下简称AB)的教程,也照着做了一遍,不过做出来的AssetBundleManager的API设计得有些不太习惯.目前想到了一个可行的解决方案.AB相关 ...