zoukankan      html  css  js  c++  java
  • 15 GIL 全局解释器锁 C语言解决 top ps

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

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

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

      1)主线程死循环

    #主线程死循环,占满cpu
    while True:
        pass

        

      2)2个线程死循环

        

    #-*- coding:utf-8 -*-
    import threading
    
    #子线程死循环
    def test():
        while True:
            pass
    
    
    t1 = threading.Thread(target=test)
    t1.start()
    
    #主线程死循环
    while True:
        pass

           

        

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

      3)2个进程实现死循环

    import multiprocessing
    
    def deadLoop():
        while True:
            pass
    
    #子进程死循环
    p1 = multiprocessing.Process(target=deadLoop)
    p1.start()
    
    #主进程死循环
    deadLoop()

         

     

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

      1)test.c 执行流程

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

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

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

        

    3.htop top 实时进程查看器

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

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

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

          

            

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

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

           

          

  • 相关阅读:
    spring hibernate 调用存储过程
    Mybatis mapper配置
    流量红包算法
    带搜索的下拉框Chosen
    生成二维码
    Linux netlink机制
    OpenFlow Switch学习笔记(七)——Matching Fields
    Hierarchical Token Bucket
    OpenvSwitch架构
    Examining Open vSwitch Traffic Patterns
  • 原文地址:https://www.cnblogs.com/venicid/p/7975892.html
Copyright © 2011-2022 走看看