python开发面试-20240715

1、python GIL锁,以及如何避免

1、使用多进程 multiprocesssing

2、使用C扩展

3、使用异步编程

4、使用外部库如Numpy、Panda

5、GIL优化:python版本升级,可能会进行优化

2、python 内存回收

Python 使用自动内存管理来回收不再使用的对象,这主要通过垃圾收集器(Garbage Collector,GC)来实现。Python 的垃圾收集器主要依赖于引用计数机制和循环垃圾收集机制。

引用计数

Python 中的每个对象都有一个引用计数,用来记录有多少个引用指向该对象。当一个对象的引用计数变为 0 时,意味着没有任何引用指向该对象,该对象可以被垃圾收集器立即回收。

引用计数机制简单有效,但也有一些局限性:

  • 循环引用问题:如果两个或多个对象相互引用,它们的引用计数永远不会变为 0,即使它们不再被使用。
  • 内存泄漏:如果程序中存在无法访问到的对象,即使它们不再被使用,也不会被回收。

循环垃圾收集

为了解决循环引用问题,Python 使用了循环垃圾收集机制。这是一种基于标记-清除(Mark-and-Sweep)算法的垃圾收集方法。

  1. 标记阶段:垃圾收集器遍历所有可达的对象,并将它们标记为活跃的。
  2. 清除阶段:垃圾收集器遍历所有未被标记的对象,并将它们回收。

Python 的循环垃圾收集器可以检测到循环引用,并能够回收这些无法通过引用计数机制回收的对象。

垃圾收集器的触发

Python 的垃圾收集器不是在每次对象不再使用时就立即触发,而是在以下情况下触发:

  • 程序显式调用 gc.collect() 函数。
  • 程序达到一定的内存使用阈值。
  • 程序启动时或退出前。

3、单例模式,以及实现方法

1、使用模块
Python 的模块本身就是一个单例。模块在第一次导入时会被初始化,之后再次导入时会使用已经初始化的模块。
# my_singleton_module.py
class Singleton:def __init__(self):self.value = 'I am a singleton'# 使用
from my_singleton_module import Singleton
singleton_instance = Singleton()2、使用装饰器
def singleton(cls):instances = {}def wrapper(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return wrapper@singleton
class MyClass:def __init__(self):self.value = 'I am a singleton'# 使用
instance1 = MyClass()
instance2 = MyClass()
print(instance1 is instance2)  # True3、使用类属性
class Singleton:_instance = Nonedef __new__(cls):if cls._instance is None:cls._instance = super(Singleton, cls).__new__(cls)return cls._instancedef __init__(self):self.value = 'I am a singleton'# 使用
instance1 = Singleton()
instance2 = Singleton()
print(instance1 is instance2)  # True4、使用元类
class SingletonMeta(type):_instances = {}def __call__(cls, *args, **kwargs):if cls not in cls._instances:instance = super().__call__(*args, **kwargs)cls._instances[cls] = instancereturn cls._instances[cls]class Singleton(metaclass=SingletonMeta):def __init__(self):self.value = 'I am a singleton'# 使用
instance1 = Singleton()
instance2 = Singleton()
print(instance1 is instance2)  # True

4、多进程,多线程,协程的区别。

Python 支持多进程、多线程和协程三种并发执行的机制,它们各自有不同的特点和用途:

多进程(Multiprocessing)

  • 定义:多进程是指操作系统为每个进程分配独立的内存空间,进程之间不共享内存。
  • 优点
    • 隔离性好:一个进程崩溃不会影响其他进程。
    • 利用多核CPU:可以充分利用多核处理器的计算能力,因为每个进程可以运行在不同的CPU核心上。
  • 缺点
    • 创建和销毁进程的开销大。
    • 进程间通信(IPC)复杂且成本高。
  • 适用场景:适合CPU密集型任务,或者需要隔离性的场景。

多线程(Multithreading)

  • 定义:多线程是指在一个进程中并行运行多个线程,线程之间共享进程的内存空间。
  • 优点
    • 资源共享:线程间可以共享数据,这使得线程间通信更加容易。
    • 创建和切换开销小。
  • 缺点
    • Python中的全局解释器锁(GIL):在CPython实现中,由于GIL的存在,同一时刻只有一个线程可以执行Python字节码,这限制了多线程在CPU密集型任务中的并行性。
    • 线程安全问题:需要同步机制来避免竞态条件和数据不一致。
  • 适用场景:适合I/O密集型任务,或者需要共享内存资源的场景。

协程(Coroutines)

  • 定义:协程是一种更轻量级的执行单元,它在用户态进行调度,而不是操作系统内核态。
  • 优点
    • 高效:协程的创建和切换开销非常小。
    • 非抢占式:协程的执行是协作式的,一个协程执行完成后主动让出控制权给另一个协程。
    • 适用于大量I/O操作:协程可以在等待I/O操作时挂起,让其他协程运行,提高效率。
  • 缺点
    • 调试困难:协程的调用栈可能不如线程和进程那样直观。
    • 错误处理:协程的错误可能会影响到整个程序的执行流程。
  • 适用场景:适合处理大量I/O密集型任务,如网络请求、文件操作等。

总结

  • 多进程:适合CPU密集型任务,可以充分利用多核处理器,但进程间通信复杂。
  • 多线程:适合I/O密集型任务,线程间可以共享内存,但在CPython中由于GIL的限制,多线程在CPU密集型任务中的并行性受限。
  • 协程:适合大量I/O操作,可以在等待I/O时让出控制权,提高程序的响应性和效率。

在Python中,可以使用multiprocessing模块来创建和管理多进程,使用threading模块来创建和管理多线程,使用asyncio库来创建和管理协程。协程在Python 3.5之后得到了原生支持,通过asyncawait关键字实现。

5、什么是闭包

1、外层方法的返回是对内部方法的调用

6、常用的进程,进程池包

from multiprocessing import Process
from concurrent.futures import ProcessPoolExecutor

7、Django生命周期

web -> wsgi -> process_request -> process_view -> view -> process_response -> wsgi -> web

8、中间件的执行顺序

如果有多个中间件,ABCDE(C是视图),执行过程是

执行ABDE的process_request

执行view逻辑

执行EDBA的process_response

9、docker 怎么进入一个运行中的容器

docker exec -it <container_name_or_id> /bin/bash

10、docker 怎么启动一个容器

# 启动一个容器

docker run -d --name new_container my_new_image

# 进入一个运行中的容器

docker exec -it my_container /bin/bash

# 交付容器,创建一个新的镜像

docker commit my_container my_new_image

11、怎么让一个容器停止时,自动销毁

docker run --rm -d --name my_container ubuntu sleep 60

-rm:容器停止时自动销毁

#

# 在dockerfile中设置cmd

FROM ubuntu
# ... 其他指令 ...

# 定义一个清理脚本
COPY cleanup.sh /cleanup.sh
RUN chmod +x /cleanup.sh

# 设置容器退出时执行清理脚本
CMD ["/cleanup.sh"]

12、dockerfile 常用的命令

  1. FROM - 指定基础镜像,所有的构建过程都是基于这个镜像开始的。

    FROM ubuntu:18.04

  2. RUN - 执行命令,通常用于安装软件包或执行脚本。

    RUN apt-get update && apt-get install -y curl

  3. CMD - 容器启动时默认执行的命令。如果有多个 CMD 指令,只有最后一个会生效。

    CMD ["python", "app.py"]

  4. ENTRYPOINT - 容器启动时要运行的可执行文件,可以与 CMD 组合使用。

    ENTRYPOINT ["python"]

  5. EXPOSE - 声明容器运行时监听的端口,不会发布端口,只是作为文档说明使用。

    EXPOSE 80

  6. ENV - 设置环境变量。

    ENV PATH /usr/local/nginx/bin:$PATH

  7. ADD - 将文件、目录或远程文件URL添加到容器中。

    ADD source_file.txt /dest/path

  8. COPY - 类似于 ADD,但只支持本地文件的复制。

    COPY source_file.txt /dest/path

  9. VOLUME - 创建一个可以从本地主机或其他容器挂载的挂载点。

    VOLUME /data

  10. WORKDIR - 设置工作目录,即容器内部的当前目录。

    WORKDIR /app

  11. USER - 设置运行容器时的用户名或 UID。

    USER nobody

  12. ARG - 构建参数,可以在构建时通过 --build-arg 传递给 Docker。

    ARG VERSION=1.0

  13. ONBUILD - 设置触发器,当以当前镜像为基础镜像时,自动执行的指令。

    ONBUILD RUN echo "Hello, this is an ONBUILD trigger"

  14. STOPSIGNAL - 设置停止容器时使用的系统调用信号。

    STOPSIGNAL SIGKILL

  15. LABEL - 添加元数据到镜像,可以是键值对。

    LABEL maintainer="name@example.com"

  16. HEALTHCHECK - 设置健康检查命令,用于确定容器是否健康。

    HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1

13、docker-compose 常用命令

  1. 启动服务: 使用 up 命令启动在 docker-compose.yml 文件中定义的所有服务。

    docker-compose up

  2. 启动服务(后台运行): 添加 -d 标志以在后台运行服务。

    docker-compose up -d

  3. 停止服务: 使用 down 命令停止所有由 docker-compose.yml 文件定义的服务,并移除容器、网络、卷和镜像。

    docker-compose down

  4. 查看服务状态: 使用 ps 命令查看所有服务的容器状态。

    docker-compose ps

  5. 查看日志: 使用 logs 命令查看服务的日志输出。

    docker-compose logs

  6. 重新启动服务: 使用 restart 命令重新启动服务。

    docker-compose restart

  7. 停止并移除容器: 使用 stop 命令停止服务中的所有容器。

    docker-compose stop

  8. 构建或重建服务: 使用 build 命令重新构建或构建服务。

    docker-compose build

  9. 拉取服务的镜像: 使用 pull 命令拉取服务的镜像。

    docker-compose pull

  10. 运行一次性命令: 使用 run 命令在服务的容器中运行一次性命令。

    docker-compose run myservice /bin/bash

  11. 查看服务详情: 使用 config 命令查看 docker-compose.yml 文件的配置详情。

    docker-compose config

  12. 扩展服务: 使用 scale 命令扩展服务的容器数量。

    docker-compose up --scale myservice=3

  13. 列出所有容器: 使用 ls 命令列出所有由 docker-compose.yml 文件管理的容器。

    docker-compose ls

  14. 推送服务的镜像: 使用 push 命令推送服务的镜像到远程仓库。

    docker-compose push

  15. 创建服务的网络: 使用 create-network 命令创建网络。

    docker-compose create-network

  16. 创建并启动服务: 使用 up 命令创建并启动服务,如果服务已经存在则只启动服务。l

    docker-compose up --create

14、redis的数据类型

string list set zset hash

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK垃圾回收机制和垃圾回收算法

查看java相关信息 java -XX:PrintCommandLineFlags -version UseParallelGC 即 Parallel Scavenge Parallel Old,再查看详细信息 内存分配策略 1. 对象优先在 Eden 分配 大多数情况下&#xff0c;对象在新生代 Eden 区分配&#xff0c;当 Eden 区空间不够时&#xff0c;发…

PX4 UM982 配合F9P Base 进行 RTK 定位

UM982是新兴的常见双天线GPS模块&#xff0c;支持双天线定向&#xff0c;RTK功能&#xff0c;PX4也引入了对其的支持&#xff0c;需要按需额外设置 官方手册号称直接用F9P做地面站&#xff0c;搭配QGC使用就能进行RTK定位 但是经过实践&#xff0c;发现这样是进不了RTK模式的…

Docker---最详细的服务部署案例

提供python服务的docker一键部署&#xff0c;示例已配置负载均衡&#xff0c;不需要的在nginx.conf和docker-compose注释相关代码即可 文件结构 1、dockerfile # 服务的dockerfile# 服务依赖的镜像 FROM python:3.7# 设置容器内服务的工作目录 WORKDIR /app# 复制当前文件夹所…

AI作画入门指南:从基础到高级的全面教程

AI作画入门指南&#xff1a;从基础到高级的全面教程 AI作画是一项融合了技术与艺术的创新领域。本指南将带你从基础到高级&#xff0c;逐步掌握AI作画的技巧&#xff0c;打造出独具个性的艺术作品。 1. 什么是AI作画&#xff1f; 定义&#xff1a;AI作画是利用人工智能技术生…

基于Rspack实现大仓应用构建提效实践|得物技术

一、实践背景 随着项目的逐步迭代&#xff0c;代码量和依赖的逐渐增长&#xff0c;应用的构建速度逐步进入缓慢期。以目前所在团队的业务应用来看&#xff08;使用webpack构建&#xff09;&#xff0c;应用整体构建耗时已经普遍偏高&#xff0c;影响日常开发测试的使用效率&am…

护网--2

实验要求&#xff1a; 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3、多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c;…

springboot 使用注解,对注解使用切面后,Controller调用service一直报null的问题解决。

百度后的答案是&#xff1a; springboot 注解加切面 后controller, service为null 报错问题&#xff1a;“springboot 注解加切面后controller, servise为null” 通常意味着在使用Spring Boot时&#xff0c;通过注解定义的切面成功创建了&#xff0c;但是与之相关联的Controll…

实现keepalive+Haproxyde 的高可用

需要准备五台实验机 一台客户机&#xff1a;test1 两台&#xff1a;一主一备的实验机&#xff1a;test2 test3 两台真实服务器&#xff1a;nginx1 nginx2 实验 首先在两台实验机上安装Haproxy 安装依赖环境&#xff0c;并将Haproxy的包进行解压处理 yum install -y pcre…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源&#xff1a;2.安装Vue CLI&#xff1a;3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境&#xff0c;它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自…

MFC:文本可视化输出

文章目录 1. DrawText&#xff1a;2. TextOut&#xff1a;3. SetTextColor&#xff1a;4. SetBkColor&#xff1a;5. GetTextMetrics&#xff1a; 在MFC&#xff08;Microsoft Foundation Classes&#xff09;中&#xff0c;CDC&#xff08;设备上下文类&#xff09;提供了多种…

Barabási–Albert模型详解与Python代码示例

Barabsi–Albert模型详解与Python代码示例 模型介绍 Barabsi–Albert&#xff08;BA&#xff09;模型是一种用于模拟和分析复杂网络结构的数学模型&#xff0c;特别适用于描述那些具有“无标度”特性的网络。无标度网络是指网络中节点的连接度&#xff08;度&#xff09;分布…

xlive.dll丢失怎么办,xlive.dll文件的主要用途

xlive.dll丢失怎么办&#xff1f;目前是有很多方法可以解决这个xlive.dll丢失的问题的&#xff0c;只要你仔细的去了解xlive.dll这个文件&#xff0c;至于使用哪种方法&#xff0c;主要还是看你的实际情况&#xff0c;因为情况不同选择使用的方法也是不一样的&#xff0c;下面一…

底软驱动 | Linux虚拟内存

为了更有效的管理内存并且少出错&#xff0c;现代操作系统提供了一种对主存的抽象概念&#xff0c;叫做虚拟内存(VM)。虚拟内存提供了三个重要的能力: 1.它将主存(物理内存)看成是一个存储在磁盘上的地址空间的高速缓存&#xff0c;在主存中只保留活动区域&#xff0c;并且根据…

去除重复数字

1083. 【基础】去除重复数字 [ 刷题2路4线 ] 时间限制: 1000MS 空间限制: 16MB 结果评判: 文本对比 正确/提交: 29 (21) / 45 官方标签: 数组 普及- 题目描述 给你N个数&#xff08;n&#xff1c;&#xff1d;&#xff11;&#xff10;&#xff10;&#xff09;,每个数都在&am…

openEuler 安装 podman 和 podman compose

在 openEuler 22.03 LTS SP4 中&#xff0c;你可以使用 dnf 包管理器来安装 Podman 和 Podman Compose。openEuler 默认使用 dnf 作为包管理器&#xff0c;所以这是安装软件的首选方式。 关于 openEuler 22.03 LTS SP4 下载地址&#xff1a; https://www.openeuler.org/zh/dow…

【256 Days】我的创作纪念日

目录 &#x1f33c;01 机缘 &#x1f33c;02 收获 &#x1f33c;03 日常 &#x1f33c;04 成就 &#x1f33c;05 憧憬 最近收到官方来信&#xff0c; 突然发现&#xff0c;不知不觉间&#xff0c;距离发布的第一篇博客已过256天&#xff0c;这期间我经历了春秋招、毕业答辩…

JS【详解】ES6 模块规范 vs CommonJS 模块规范

每个 js 文件都是一个模块&#xff0c;默认采用的 CommonJS 模块规范 新兴的 ES6 模块 pk 传统的 CommonJS 模块 特性CommonJSES6 模块化导出exports 对象export 关键字导入require()函数import 关键字加载模式同步异步执行模式单例单例依赖关系静态动态树形摇晃不支持支持 加…

板级调试小助手(3)基于PYNQ的OLED视频显示

一、前言 在之前的文章中介绍了《板级调试小助手》的系统结构和DDS自定义外设的搭建。这篇文章主要介绍一下如何在PYNQ中驱动平时长剑的OLED12864显示屏&#xff0c;并显示BadApple&#xff08;毕竟有屏幕的地方就要有BadApple&#xff09;。效果如下&#xff1a; BadApple 本项…

Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法

在Spring配置数据源时&#xff0c;当使用Spring容器加载druid.properties数据库连接池配置文件时&#xff0c;容易碰到create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/mydbs, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user …