python中的并发是同时发生的事情由线程,任务,进程调用(实际上还是按顺序运行的一系列指令)。宏观上看,线程,任务和进程是相同的,细节上她们代表不同的东西。事实上只有多进程在同一时间运行着多个任务,线程和异步都在单个处理器运行,即一次只能处理一个任务。
先占式多工法:操作系统知道每个线程,并且可以随时中断该线程后运行别的线程,即对线程进行切换。线程的切换可以发生在单个python语句里,在任何时候都可能需要进行任务切换。
多核CPU的并行,通过多进程,python创建新的进程(一半来说电脑几核就开几个进程)。每一个进程可以被看做是一个完全不同的程序,每一个进程都在自己的python解释器中运行。
并发在CPU绑定和IO绑定问题上有很大影响,因为需要等待外部资源的输入输出或者程序处理的是比CPU慢得多的东西(通常是文件系统和网络连接)。在程序里添加并发性会增加额外的代码和复杂性,需在确定加速之前评估是否值得这样做。如不好的架构会导致并发或并行无法发挥加速作用,而推倒重来很多时候不允许。
多线程添加实例,以网络访问为例子
未添加多线程的程序:
import requests
import time
def download_site(url,session):
with session.get(url) as response:
print(f"read {len(response.content)} from {url}")
def download_all_sites(sites):
with requests.Session() as session:
for ur