Python的运行原理

概述

Python、PHP、Java都有各自的垃圾回收机制,且针对高并场景都有相应的解决方案;

Python

Python提供了多线程、多进程和异步IO三种并发解决方案;但综合来看Python的并发处理能力相对较弱:

多进程:每个进程都有自己的解释器,各进程互不影响,能够充分利用多核CPU;

多线程:多个线程通过同一个解释器交替执行,并非真正的并行;为了确保线程安全,解释器通过全局解释器锁来确保同一时间只有一个线程执行;

异步IO(协程):在一个线程内让程序的IO操作不阻塞,而是继续执行其他任务;类似Javascript在单线程中发起异步请求一样,异步IO(协程)同样也是通过事件循环来实现的;

PHP

php通过多进程来实现并发,主要依赖于PHP-FPM FastCGI进程管理器,每个进程同一时间处理一个请求;

Java

Java的高并发通过多线程来实现,Java提供了适合大规模应用程序的线程池管理;并且其线程可以在多个CPU核心上并行运行。

一个线程同一时间只能处理一个请求,但是可以通过多线程的方式实现并发处理多个请求,线程池可以根据需要动态创建新线程,或者复用已有的线程。

总结

以下几种方式在处理Web并发请求时各有优略,并没有较大的差异或绝对的优胜:

1. 使用 Nginx + php-fpm + php 开发的web应用通过多进程来应对高迸发,一个进程同一时间处理一个请求;

每个进程都需要加载 PHP 解释器,会增加内存占用。每个进程都需要独立处理 IO 操作,这可能会导致性能瓶颈。

2. 使用 Nginx + FastAPI 开发的web应用是单线程运行,通过创建多个异步任务来应用高并发,一个异步任务同一时间处理一个请求;

异步编程的编写和调试比较困难,异步操作可能会导致数据一致性问题

3. 使用 Java 开发的web应用通过多线程来实现高并发,一个线程同一时间处理一个请求;

线程上下文切换会导致性能损失,线程安全需要注意。

文件锁

使用多线程、多进程、异步任务等技术在高并发的情况同时写入同一文件资源时,都要先从操作系统获取该文件的文件锁,并在写入完成后释放;以此来避免并发写入同一文件时的混乱。不同的应用程序在同时操作同一个文件资源时,也是先从操作系统获取文件锁,操作系统以此来控制多个应用程序对同一文件的有序写入。

操作系统提供了两种文件锁机制:

1>. 共享锁:允许多个进程或线程同时读取文件,但不允许写入文件。

2>. 排他锁:允许一个进程或线程独占文件,其他进程或线程都无法访问文件。

虚拟线程和CPU线程

Web应用经常会通过多线程或多进程来处理并发请求,这种情况下服务器的线程或进程数可能与CPU线程数对应,但也可能会虚拟出更多线程或进程,这取决于具体的Web服务器的机制。如果CPU的线程数是8,而Web服务器虚拟出来了100个线程或进程,但同一时间也只会有8个线程真正的并发执行,CPU会通过不同的时间片段来执行这些线程或进程。

Python与其它语言交互

Python与其它语言交互的最佳方案是通过 FastAPI 向外暴露 HTTP 接口,以供其它语言调用;FastAPI 是众多 Python Web 框架中并发性能最好的一个。

常驻内存的优势

https://sidoc.cn/doc/1561.html


举报

© 著作权归作者所有


1