美文网首页
进阶学习7-并发/并行

进阶学习7-并发/并行

作者: 龙猫六六 | 来源:发表于2020-01-30 18:55 被阅读0次

并发和并行

并发

  • 同一时刻只允许一个操作,线程/任务之间相互切换,达到并发处理任务
  • 单线程:协程(asyncio)
  • 多线程:Futures(threading)
  • 并发通常应用与I/O操作频繁的场景

并行

  • 同一时刻同时发送
  • 多进程
  • 并行通常应用于CPU heavy的场景

单线程并发-协程

单个协程实现并发,建议使用I/O密集型场景
python3.7及以上

描述 备注
async 异步函数申明 将普通函数申明为异步函数
await 异步函数调用 同步调用异步函数,返回协程对象
asyncio.create_taks() 创建任务
asynic.gater(*tasks) 执行task
asynic.run 触发运行
协程实例

协程使用步骤:

  • 使用asynic修饰函数,定义为异步函数
  • await调用异步函数,注意:同步调用,需要task来实现真正的并发
  • task创建:task任务asynic.create_task(异步函数)
  • task调度:创建调度器,统一调度任务 await asynic.gather(*task)
  • 运行协程:asynic.run(异步函数)
  • 第三方库要支持协程,如request不支持协程,改用aiohttp
import asyncio

async def crawl_page(url):
    print('crawling {}'.format(url))
    sleep_time = int(url.split('_')[-1])
    await asyncio.sleep(sleep_time)
    print('OK {}'.format(url))

async def main(urls):
    tasks = [asyncio.create_task(crawl_page(url)) for url in urls]
    await asyncio.gather(*tasks)

asyncio.run(main(['url_1', 'url_2', 'url_3', 'url_4']))

多线程并发- future

  • 全局解释器:Python 便引入了全局解释器锁,也就是同一时刻,只允许一个线程执行。当然,在执行 I/O 操作时,如果一个线程被 block 了,全局解释器锁便会被释放,从而让另一个线程能够继续执行
描述 备注
future future对象 将处于等待状态的操作包裹起来放到队列
ThreadPoolExcutor 创建线程池 max_workers=5
PorcessPoolExcutor 创建进程池 max_workers=5
executor.submit(func) func被包裹成future对象,返回future实例
future.as_completed(fn) future完成后,回调函数fn
future.result() future完成后,返回对应结果或异常

实例

from concurrent.futures import Future, ThreadPoolExecutor, as_completed
import requests
import time

def download_one(url):
    resp = requests.get(url)
    print('Read {} from {}'.format(len(resp.content), url))


def download_all(urls):
    with ThreadPoolExecutor(5) as excutor:
        to_do = []
        for url in urls:
            future = excutor.submit(download_one, url)
            to_do.append(future)

        for future in as_completed(to_do):
            future.result()


if __name__ == '__main__':
    sites = [
        "https://www.19lou.com",
        "https://food.19lou.com",
        "https://tour.19lou.com",
        "https://auto.19lou.com",
        "https://fashion.19lou.com",
        "https://sweet.19lou.com",
        "https://love.19lou.com",
        "https://marry.19lou.com",
        "https://money.19lou.com"
    ]

    st = time.perf_counter()
    download_all(sites)
    et = time.perf_counter()

相关文章

  • 进阶学习7-并发/并行

    并发和并行 并发 同一时刻只允许一个操作,线程/任务之间相互切换,达到并发处理任务 单线程:协程(asyncio)...

  • 并发进阶

    前面讲述了一些Go语言中并发的基础内容,今天来讲一下Go语言并发的进阶内容。 多核并行化 我们在执行并行计算的时候...

  • 服务器并发设计

    并发与并行 并发技术选型 结构并发 状态并发 集群和负载均衡 并发(Coccurrency)和并行(Paralle...

  • java高并发之从零到放弃

    前言 这是一个长篇博客,希望大家关注我并且一起学习java高并发 废话不多说,直接开始 并行和并发 并行:多个线程...

  • Java并发编程整理之并发与并行概念讲解(1)

    Java并发编程整理之并发与并行概念讲解(1) 并发和并行区别 --[百度]:并发(Concurrent)当有多个...

  • JS异步编程相关知识点

    并发(concurrency)和并行(parallelism)区别 涉及面试题:并发与并行的区别? 并发是宏观概念...

  • Go并发

    并发和并行 Go是并发语言,而不是并行语言。(Go is a concurrent language and no...

  • Golang学习笔记-Goroutines

    并发 首先 go 是一个实现并发的语言,并非并行 并发 vs 并行 并行是在同一时间内,可以同时执行多个任务;并发...

  • 并发简介

    并发基本概念 并发与并行 并发指的是程序的结构,而并行指的是程序运行时的状态。 何谓并发(concurrency)...

  • [转]并发和并行有什么区别

    做并发编程之前,必须首先理解什么是并发,什么是并行,什么是并发编程,什么是并行编程。 并发(concurrency...

网友评论

      本文标题:进阶学习7-并发/并行

      本文链接:https://www.haomeiwen.com/subject/hkwithtx.html