赞
踩
多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴的等待IO完成。
多进程:multiprocessing,利用多核CPU的能力,真正并行执行任务。
异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行。
使用 Lock对资源加锁,防止冲突访问
使用Queue实现不同线程、进程之间的数据通信,实现生产者-消费者模式
使用线程池Pool、进程池Pool,简化线程、进程的任务提交、等待结束、获取结果
多进程Process(multiprocessing):
优点:可以利用多核CPU并行计算
缺点:占用资源最多、可启动数目比线程少
适用于:CPU密集型计算
多线程Thread(threading):
优点:相比进程,更轻量级、占用资源少
缺点: 1. 相比进程:多线程只能并发执行,不能利用多CPU(GIL)(python多线程中只能使用单CPU)
2. 相比协程:启动数目有限制,占用内存资源,有线程切换开销
适用于:IO密集型计算、同时运行的任务数目要求不多
多协程Corotine(asyncio):
优点:内存开销最少、启动协程数量最多
缺点:支持的库有限制、代码实现复杂
适用于:IO密集型计算、需要超多任务运行、但有现成的库支持的场景
IO(读写内存、发送、网络等)
关系:进程 > 线程 > 协程,一个进程中可以启动多个线程,一个线程中可以启动多个协程。
同步线程的一种机制,使得任何时刻仅有一个线程在执行。在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTXRZMgJ-1655734406988)(file:///D:\app\QQ\My_FILE\676221979\Image\Group2\N([J\N([JRTM]T]3G8P}_B5`S[18.png)]![img]
简而言之:python设计初期,为了规避并发问题引入了GIL,现在想去除却去不掉
多线程threading机制依然是有用的,用于IO密集型计算
因为在IO期间,线程会释放GIL,实现CPU和IO并行,因此多线程用于IO密集型计算依然可以大幅提升速度,
但是多线程用于CPU密集型计算时,只会更加拖慢速度。
使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势
为了应对GIL的问题,python提供了multiprocessing
from threading import Thread
t=Thread(target=func, args=(100, ))
t.start()
t.join()
import queue
q = queue.Queue()
q.put(item)
item = q.get()
from threading import Lock
lock = Lock()
with lock:
RLock和Lock的区别:
RLock支持嵌套锁,Lock只支持锁一次解一次,不支持嵌套锁。RLock又叫递归锁,Lock又叫互斥锁。如果Lock锁上没有解锁,再锁上一次,会造成死锁。死锁另外一种情况是由于竞争资源或由于彼此通信而造成阻塞的现象。
eg:两个线程函数func1和func2,分别被lock1和lock2锁上,在func1里(lock1未解锁)再用lock2上锁,在func2里在用lock1上锁.
from threading import Semaphore
semaphre = Semaphore(10)
with semaphre:
线程池的原理
使用线程池的好处
ThreadPoolExecutor的使用语法
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor() as pool:
results = pool.map(func, args)
# args 对应着results
future = pool.submit(func, 1)
# 一个一个执行,一个arg对应一future
futures = [pool.submit(func, arg) for arg in args]
# 两种遍历方式
# 1
for future in futures:
print(future.result())
# 2
for future in as_completed(futures):
print(future.result())
使用线程池改造爬虫
如果遇到了 CPU密集型计算,线程自动切换反而变成了负担,多线程反而会降低执行速度,multiprocessing模块就是python为了解决GIL缺陷引入的模块,原理就是用多进程在多CPU上并发执行。
语法 | 多线程 | 多进程 |
---|---|---|
引入模块 | from threading import Thread | from multiprcessing import Prcoess |
新建 启动 等待结束 | t = Thread(target=func, args=(100,)) t.start t.join() | p = Process(target=func, args=('bob',)) p.start p.join() |
数据通信 | import queueq = queue.Queue() q.put(item) item = q.get() | from multiprcessing import Queue q = Queue() q.put([42, None, 'hello']]) item = q.get() |
安全加锁 | from threading import Lock lock = Lock() with lock: pass | from multiprocessing import Lock lock = Lock() with lock: pass |
池化技术 | from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as pool: # 方法1 results = pool.map(func, args) # args 对应着results # 方法2 future = pool.submit(func, 1) result = future.result() | from concurrent.futures import ProcessPoolExecutor with ProcessPoolExecutor() as pool: # 方法1 results = pool.map(func, args) # args 对应着results # 方法2 future = pool.submit(func, 1) result = future.result() |
进程间相互独立
多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴的等待IO完成。
多进程:multiprocessing,利用多核CPU的能力,真正并行执行任务。
异步IO:asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行。
使用 Lock对资源加锁,防止冲突访问
使用Queue实现不同线程、进程之间的数据通信,实现生产者-消费者模式
使用线程池Pool、进程池Pool,简化线程、进程的任务提交、等待结束、获取结果
多进程Process(multiprocessing):
优点:可以利用多核CPU并行计算
缺点:占用资源最多、可启动数目比线程少
适用于:CPU密集型计算
多线程Thread(threading):
优点:相比进程,更轻量级、占用资源少
缺点: 1. 相比进程:多线程只能并发执行,不能利用多CPU(GIL)(python多线程中只能使用单CPU)
2. 相比协程:启动数目有限制,占用内存资源,有线程切换开销
适用于:IO密集型计算、同时运行的任务数目要求不多
多协程Corotine(asyncio):
优点:内存开销最少、启动协程数量最多
缺点:支持的库有限制、代码实现复杂
适用于:IO密集型计算、需要超多任务运行、但有现成的库支持的场景
IO(读写内存、发送、网络等)
关系:进程 > 线程 > 协程,一个进程中可以启动多个线程,一个线程中可以启动多个协程。
同步线程的一种机制,使得任何时刻仅有一个线程在执行。在多核心处理器上,使用 GIL 的解释器也只允许同一时间执行一个线程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jTXRZMgJ-1655734406988)(file:///D:\app\QQ\My_FILE\676221979\Image\Group2\N([J\N([JRTM]T]3G8P}_B5`S[18.png)]![img]
简而言之:python设计初期,为了规避并发问题引入了GIL,现在想去除却去不掉
多线程threading机制依然是有用的,用于IO密集型计算
因为在IO期间,线程会释放GIL,实现CPU和IO并行,因此多线程用于IO密集型计算依然可以大幅提升速度,
但是多线程用于CPU密集型计算时,只会更加拖慢速度。
使用multiprocessing的多进程机制实现并行计算、利用多核CPU优势
为了应对GIL的问题,python提供了multiprocessing
from threading import Thread
t=Thread(target=func, args=(100, ))
t.start()
t.join()
import queue
q = queue.Queue()
q.put(item)
item = q.get()
from threading import Lock
lock = Lock()
with lock:
RLock和Lock的区别:
RLock支持嵌套锁,Lock只支持锁一次解一次,不支持嵌套锁。RLock又叫递归锁,Lock又叫互斥锁。如果Lock锁上没有解锁,再锁上一次,会造成死锁。死锁另外一种情况是由于竞争资源或由于彼此通信而造成阻塞的现象。
eg:两个线程函数func1和func2,分别被lock1和lock2锁上,在func1里(lock1未解锁)再用lock2上锁,在func2里在用lock1上锁.
from threading import Semaphore
semaphre = Semaphore(10)
with semaphre:
线程池的原理
使用线程池的好处
ThreadPoolExecutor的使用语法
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor() as pool:
results = pool.map(func, args)
# args 对应着results
future = pool.submit(func, 1)
# 一个一个执行,一个arg对应一future
futures = [pool.submit(func, arg) for arg in args]
# 两种遍历方式
# 1
for future in futures:
print(future.result())
# 2
for future in as_completed(futures):
print(future.result())
使用线程池改造爬虫
如果遇到了 CPU密集型计算,线程自动切换反而变成了负担,多线程反而会降低执行速度,multiprocessing模块就是python为了解决GIL缺陷引入的模块,原理就是用多进程在多CPU上并发执行。
语法 | 多线程 | 多进程 |
---|---|---|
引入模块 | from threading import Thread | from multiprcessing import Prcoess |
新建 启动 等待结束 | t = Thread(target=func, args=(100,)) t.start t.join() | p = Process(target=func, args=('bob',)) p.start p.join() |
数据通信 | import queueq = queue.Queue() q.put(item) item = q.get() | from multiprcessing import Queue q = Queue() q.put([42, None, 'hello']]) item = q.get() |
安全加锁 | from threading import Lock lock = Lock() with lock: pass | from multiprocessing import Lock lock = Lock() with lock: pass |
池化技术 | from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor() as pool: # 方法1 results = pool.map(func, args) # args 对应着results # 方法2 future = pool.submit(func, 1) result = future.result() | from concurrent.futures import ProcessPoolExecutor with ProcessPoolExecutor() as pool: # 方法1 results = pool.map(func, args) # args 对应着results # 方法2 future = pool.submit(func, 1) result = future.result() |
进程间相互独立
线程池里,multiporcessing.RLock() 不可使用
使用: manager = multiprocessing.Manager()
lock = manager.RLock()
RLock 可以多次使用多次释放、递归锁
Lock
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。