- 网络 udp
- 多任务 线程
- 多任务 线程、进程
- 网络 tcp
- 飞鸽传书 完善
- 多任务 协程
- 正则表达式
- 网络通信过程、http 协议
- Web 服务器 并发服务器
- WSGI、mini Web 框架
- 装饰器、mini Web 框架 路由
- MySQL 基本使用
- MySQL 查询
- MySQL 与 Python 交互
- mini Web 框架 添加 MySQL 功能
- 其它知识
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
GIL
GIL(全局解释器锁)
1. 单线程死循环
在VMware虚拟软件中将Ubuntu设置为单核cpu
# 主线程死循环,占满cpu
while True:
pass
2. 多线程死循环
在VMware虚拟软件中将Ubuntu设置为双核cpu
import threading
#子线程死循环
def test():
while True:
pass
t1 = threading.Thread(target=test)
t1.start()
#主线程死循环
while True:
pass
惊奇的发现:在双核cpu下,2个线程的程序,竟然只占用到50%,why......?
GIL
GIL 的全程为Global Interpreter Lock ,意即全局解释器锁。
在 Python 语言的主流实现 CPython 中,GIL 是一个货真价实的全局线程锁,在解释器解释执行任何 Python 代码时,都需要先获得这把锁才行,在遇到 I/O 操作时会释放这把锁。
如果是纯计算的程序,没有 I/O 操作,解释器会每隔 100 次操作就释放这把锁,让别的线程有机会执行
3. GIL的解决方式-多进程死循环
import multiprocessing
def deadLoop():
while True:
pass
#子进程死循环
p1 = multiprocessing.Process(target=deadLoop)
p1.start()
#主进程死循环
deadLoop()
4. GIL的解决方式-调用其它语言
loop.c(新建)
void DeadLoop()
{
while(1)
{
;
}
}
编译(得到libdead_loop.so)
# 把一个c语言文件编译成一个动态库的命令(linux平台下):
# gcc xxx.c -shared -o libxxxx.so
gcc loop.c -shared -o libdead_loop.so
main.py(调用libdead_loop.so中的函数)
from ctypes import *
from threading import Thread
# 加载动态库
lib = cdll.LoadLibrary("./libdead_loop.so")
# 创建一个子线程,让其执行c语言编写的函数,此函数是一个死循环
t = Thread(target=lib.DeadLoop)
t.start()
# 主线程,也调用c语言编写的那个死循环函数
lib.DeadLoop()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论