并发编程(四),python 线程池web实战以及多进程

目录

web服务使用线程池加速

 python 中的多进程

有了多线程为什么还需要多进程multiprocessing

多线程与多进程使用对比

代码实战,单线程,多线程,多进程 CPU密集型时间对比


web服务使用线程池加速

web服务的特点:

  1. Web服务对响应时间要求较高
  2. Web服务中有大量的依赖I/O操作的调用,比如:数据库读取,文件写入,远程API
  3. Web服务通常能被几百万人访问,同时请求,不能无限制创建线程,要用到线程池

使用 ThreadPoolExecutor的好处:

  1. 方便将磁盘文件,数据库,远程API的I/O调用并发执行
  2. 线程池的数目不会无限创建(导致系统挂掉),具有防御功能。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值