python多进程cpu的占用率很低_python数据结构和GIL及多进程!

一 数据结构和GIL

1 queue

标准库queue模块,提供FIFO的queue、LIFO的队列,优先队列

Queue 类是线程安全的,适用于多线程间安全的交换数据,内部使用了Lock和Condition

为什么说容器的大小不准确,其原因是如果不加锁,是不可能获取到准确的大小的,因为你刚读取了一个大小,还没取走,有可能被就被其他线程修改了,queue类的size虽然加了锁,但是依然不能保证立即get,put就能成功,因为读取大小和get,put方法是分来的。

Python资源共享群:626017123

2 GIL

1 简介

全局解释器锁,进程级别的锁GIL
Cpython在解释器进程中有一把锁,叫做GIL全局解释器锁。
GIL 保证Cpython进程中,当前时刻只有一个线程执行代码,甚至在多核情况下,也是如此。

2 IO 密集型和CPU密集型

Cpython中

IO 密集型,由于线程阻塞,就会调度其他线程

CPU密集型,当前线程可能连续获取GIL,导致其他线程几乎无法使用CPU,若要唤醒其他线程,则需要准备数据,其代价是高昂的。

IO 密集型,多线程解决,CPU密集型,多进程解决,绕开GIL。
python中绝大多数内置数据结构的读写操作都是原子操作

由于GIL 的存在,python的内置数据类型在多线程编程的时候就变得安全了,但是实际上他们本身不是线程安全类型的

3 保留GIL 原因

Guido坚持的简单哲学,对于初学者门槛低,不需要高深的系统知识也能安全,简单的使用python。

而移除GIL。会降低Cpython单线程的执行效率。

4 验证其是否是单线程

相关实例

import  logging
import datetime
logging.basicConfig(level=logging.INFO,format="%(asctime)s  %(threadName)s %(message)s ")
start=datetime.datetime.now()

def calc():
    sum=0
    for _ in range(1000000000):
        sum+=1

calc()
calc()
calc()
calc()
calc()
delta=(datetime.datetime.now()-start).total_seconds()
logging.info(delta)

907f2140b624b3f71e6773cd0cc54883.png

多线程模式下的计算结果

import  logging
import datetime
import threading
logging.basicConfig(level=logging.INFO,format="%(asctime)s  %(threadName)s %(message)s ")
start=datetime.datetime.now()

def calc():
    sum=0
    for _ in range(1000000000):
        sum+=1
lst=[]
for _ in range(5):
    t=threadi
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值