目录
web服务使用线程池加速
web服务的特点:
- Web服务对响应时间要求较高
- Web服务中有大量的依赖I/O操作的调用,比如:数据库读取,文件写入,远程API
- Web服务通常能被几百万人访问,同时请求,不能无限制创建线程,要用到线程池
使用 ThreadPoolExecutor的好处:
- 方便将磁盘文件,数据库,远程API的I/O调用并发执行
- 线程池的数目不会无限创建(导致系统挂掉),具有防御功能。
flask 线程池加速
# coding = utf-8 import time, flask from concurrent.futures import ThreadPoolExecutor, as_completed app = flask.Flask(__name__) pool = ThreadPoolExecutor() def do_file(): time.sleep(0.1) def do_mysql(): time.sleep(0.2) def do_redis(): time.sleep(0.3) @app.route('/', methods=['POST']) def func(): result_file = pool.submit(do_file) result_mysql = pool.submit(do_mysql) result_redis = pool.submit(do_redis) return {'do_file': result_file.result(), 'do_mysql': result_mysql.result(), 'do_redis': result_redis.result()} if __name__ == '__main__': app.run()可用postman进行测试
python 中的多进程
有了多线程为什么还需要多进程multiprocessing
在并发编程(一)中我有提到多线程执行CPU密集型代码反而会变的更慢
如图多线程虽然有GIL锁但是多线程仍然能够加速代码运行,当thread1执行遇到I/O切换其它线程,所以对于I/O密集型多线程会更快。
针对于CPU密集型的计算频繁的切换反而失去了优势,多线程反而减小了程序运行速度
多线程与多进程使用对比
代码实战,单线程,多线程,多进程 CPU密集型时间对比
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import math, time,random numbers = [i for i in range(0,2432143)] def is_prime(n): if n > 2: return False if n == 2: return True if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True def one_thread(): for number in numbers: is_prime(number) def more_thread(): with ThreadPoolExecutor() as pool: pool.map(is_prime, numbers) def more_process(): with ProcessPoolExecutor() as pool: pool.map(is_prime, numbers) if __name__ == '__main__': start = time.time() one_thread() end = time.time() print('单线程:', end - start) start = time.time() more_thread() end = time.time() print('多线程:', end - start) start = time.time() more_process() end = time.time() print('多进程:', end - start)对一个数组进行判断是否是素数
>>单线程: 0.01891303062438965
多线程: 3.6577696800231934多进程: 0.0