猴子补丁、反射、并发并行、同步异步
1 什么是猴子补丁,有什么用途
-猴子补丁:在程序运行过程中,动态替换的一种技术
-1 比如咱们json模块,用内置的json,效率低,有一个第三方的ujson模块
-不改变原来程序代码,把程序中所有json都替换成ujosn
-在程序运行的入口处:import ujson as json
-2 django中 pymysql的替换
import pymsql
pymysql.install_as_mysqlDB()
-3 gevent---》猴子补丁---》monkey.pach_all()---》动态的替换内部的会阻塞的代码
-time
-socket
-把所有内置的会释放gil锁的模块,动态替换成gevent自己写的,不会释放gil锁的模块
-同步代码:io操作,会阻塞,会释放gil锁,这条线程就会被释放cpu的执行
-动态的把所有同步的代码,都替换成异步代码,把所有会阻塞的代码,都替换
-异步代码,遇到io,不释放gil锁
2 什么是反射,python中如何使用反射
-反射:是程序在运行过程中通过字符串来操作对象的属性和方法
-getattr
-setattr
-hasattr
-delattr
3 http和https的区别
-https=http+ssl/tls
-监听端口不一样,80,443、
-保证了http传输的安全
4.并发和并行
在 Python 中,并发(Concurrency)和并行(Parallelism)是两个与多任务处理相关的概念,它们都涉及到在同一时间处理多个任务的能力,但有着不同的实现方式和目的。
并发(Concurrency):
并发是指在同一时间段内,多个任务交替执行,通过在任务之间快速切换来实现同时执行的错觉。在并发模型中,一个任务在等待某个事件(比如IO操作或其他任务的完成)的同时,其他任务可以继续执行,而不是一直等待该事件完成。并发通常是在单个处理器(核心)上实现的。
Python 中的并发主要通过异步编程来实现,例如使用 asyncio 或 threading 模块。异步编程允许多个任务共享同一个线程,并且通过非阻塞的方式实现任务之间的切换,从而提高程序的效率和响应能力。
并行(Parallelism):
并行是指在同一时刻执行多个任务,每个任务都在不同的处理器(核心)上运行,实现真正的同时执行。并行通常涉及多核心或多处理器的情况,通过将任务划分为多个子任务并在多个处理器上同时执行,从而加速整体任务的完成。
在 Python 中,要实现并行,可以使用 multiprocessing 模块。这个模块允许在多个进程中同时执行任务,每个进程都在自己独立的内存空间中运行,相互之间不会干扰。
虽然并发和并行都可以处理多任务,但它们适用于不同的场景:
并发适用于IO密集型任务,比如网络请求、文件读写等,它可以在等待IO的同时处理其他任务,提高效率。
并行适用于CPU密集型任务,比如复杂的数学计算、图像处理等,它可以利用多核处理器的能力,加速任务的完成。
综上所述,在 Python 中,并发和并行是两种不同的多任务处理方式,选择合适的方式取决于任务的性质和运行环境。
5.同步和异步
在 Python 中,同步(Synchronous)和异步(Asynchronous)是两种不同的编程概念,用于处理程序中的任务和操作。
同步(Synchronous):
同步指的是任务按照预定的顺序依次执行,每个任务必须等待上一个任务完成后才能开始执行。在同步编程中,程序会按照代码的顺序一步一步执行,每一步都会等待前一步完成后再继续执行。
举个例子,假设有两个函数 func1() 和 func2(),如果在同步编程中调用它们:
def func1():
print("Func1 started")
# Some time-consuming task here
print("Func1 completed")
def func2():
print("Func2 started")
# Some time-consuming task here
print("Func2 completed")
# 同步调用
func1()
func2()
输出的结果:
Func1 started
Func1 completed
Func2 started
Func2 completed
可以看到,func2() 必须等待 func1() 完成后才能执行。
异步(Asynchronous):
异步指的是任务不按照固定顺序执行,而是根据任务是否完成来决定是否执行下一个任务。在异步编程中,可以执行一个任务的同时启动另一个任务,不必等待前一个任务完成。
Python 中引入了 asyncio 模块,用于实现异步编程。异步编程使用 async/await 关键字来标记异步函数,并通过 asyncio 来调度异步任务的执行。
举个例子,使用异步编程来实现上面的例子:
import asyncio
async def func1():
print("Func1 started")
# Some time-consuming task here
await asyncio.sleep(2)
print("Func1 completed")
async def func2():
print("Func2 started")
# Some time-consuming task here
await asyncio.sleep(1)
print("Func2 completed")
# 异步调用
async def main():
await asyncio.gather(func1(), func2())
# 使用异步事件循环
if __name__ == "__main__":
asyncio.run(main())
输出的结果:
Func1 started
Func2 started
Func2 completed
Func1 completed
可以看到,func1() 和 func2() 交替执行,而不必等待对方完成。
异步编程适用于需要处理大量并发任务、网络请求、IO操作等场景,它可以提高程序的执行效率和响应能力。然而,异步编程的实现相对复杂,需要对异步模型有一定的理解和掌握。因此,在选择同步还是异步编程时,要根据具体的应用场景和需求来决定。