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