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 命令用于杀死进程。