python并发编程(多线程、多进程、多协程)

文章截图来源来源B站:蚂蚁学python

 引入并发,就是为了提升程序运行速度

 1、基础介绍

1-1 CPU密集型计算、IO密集型计算

  1-2 多进程、多线程、多协程对比

 2、全局解释器锁GIL

2-1 python速度慢的两大原因

2-2 GIL是什么

2-3 为什么有GIL这个东西

  

2-4 怎样规避GIL带来的限制

3实践

3-1python创建多线程的方法

 3-2实践爬虫代码(单线程和多线程)

blog_spider.py代码

 muti_thread_craw.py代码

3-3生产者消费者爬虫

获取网页中标题及链接

 获取网页中标题及链接的多线程代码

 

打印输出 

4、线程安全问题以及Lock解决方案

4-1线程安全概念介绍

4-2 LOCK用于解决线程安全问题

4-3 实例代码演示问题及解决方案

 执行如下:

 修改方法如下:

import threading

lock = threading.Lock()

5、线程池

5-1线程池的原理

5-2使用线程池的好处

5-3ThreadPoolExecutor使用语法

5-4ThreadPoolExecutor 代码实现

 as_completed方式(顺序不一定)

 6 、线程池在web服务中实现加速

6-1web服务的架构及特点

6-2使用线程池加速

6-3代码用Flask实现web服务并加速

加速方案 

7、多进程multiprocessing

 代码对比

import math
import time

from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor

PRIMES = [112272535095293] * 100


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 single_thread():
    for number in PRIMES:
        is_prime(number)


def muti_thread():
    with ThreadPoolExecutor() as pool:
        pool.map(is_prime, PRIMES)


def muti_process():
    with ProcessPoolExecutor() as pool:
        pool.map(is_prime, PRIMES)



if __name__ == "__main__":
    start = time.time()
    single_thread()
    end = time.time()
    print(f'single_thread const {end - start} s')

    start = time.time()
    muti_thread()
    end = time.time()
    print(f'muti_thread const {end - start} s')

    start = time.time()
    muti_process()
    end = time.time()
    print(f'muti_process const {end - start} s')

single_thread const 51.12013626098633 s

muti_thread const 52.01384997367859 s

muti_process const 15.291653871536255 s

8、Flask中使用多进程池加速 

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

 调用方式

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值