美文网首页
多线程多进程多协程(转载)

多线程多进程多协程(转载)

作者: 言午日尧耳总 | 来源:发表于2022-04-05 17:33 被阅读0次

多线程多进程多协程(转载)

多线程

  1. 定义一个函数
def my_func(a,b):
    do_something(a,b)
  1. 创建线程
import threading

t = threading.Thread(target=my_func, args=(a, b))
  1. 启动线程
t.start()
  1. 等待结束
t.join()

队列

  • queue.Queue是线程安全的
import queue

q = queue.Queue()

# 添加与获取
q.put(time)
item = q.get()

# 查看状态
q.qsize()
q.empty()
q.full()

线程安全(锁)

  1. try-finally
import threading

lock = threading.Lock()
lock.acquire()
try:
    # do something
finally:
    lock.release()
  1. with
import threading

lock = threading.Lock()
with lock:
    # do something

线程池

  1. map函数,结果预入参顺序对应
from concurrent.futures import ThreadPoolExecutor

arg_list = []

with ThreadPoolExecutor() as pool:
    results = pool.map(my_func, arg_list)

    for result in results:
        print(results)
  1. submit函数,as_completed顺序可按完成顺序
from concurrent.futures import ThreadPoolExecutor, as_completed

arg_list = []

with ThreadPoolExecutor() as pool:
    futures = [pool.submit(my_func, arg) for arg in arg_list]

    # 按输入顺序
    for future in futures:
        print(future.result())

    # 按完成顺序
    for future in as_completed(futures):
        print(future.result())

Flask中使用线程池

import time
from concurrent.futures import ThreadPoolExecutor
from flask import Flask

app = Flask(__name__)
pool = ThreadPoolExecutor()


def do_1():
    time.sleep(1)
    return 'do_1'


def do_2():
    time.sleep(1)
    return 'do_2'


def do_3():
    time.sleep(1)
    return 'do_3'


@app.route("/")
def index():
    result_1 = pool.submit(do_1)
    result_2 = pool.submit(do_2)
    result_3 = pool.submit(do_3)
    return {
        '1': result_1.result(),
        '2': result_2.result(),
        '3': result_3.result(),
    }


if __name__ == "__main__":
    app.run()

多进程

图片截图自 蚂蚁学Python Bilibili 03:00

multiprocessing.png

Flask使用多进程

import time
from concurrent.futures import ProcessPoolExecutor
from flask import Flask

app = Flask(__name__)


def do_1():
    time.sleep(1)
    return 'do_1'


def do_2():
    time.sleep(1)
    return 'do_2'


def do_3():
    time.sleep(1)
    return 'do_3'


@app.route("/")
def index():
    result_1 = pool.submit(do_1)
    result_2 = pool.submit(do_2)
    result_3 = pool.submit(do_3)
    return {
        '1': result_1.result(),
        '2': result_2.result(),
        '3': result_3.result(),
    }


if __name__ == "__main__":
    pool = ProcessPoolExecutor()
    app.run()

协程:asyncio、await

import asyncio
import aiohttp

loop = asyncio.get_event_loop()


async def get_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            result = await resp.text()
            print(f"url:{url},{len(result)}")


urls = [f"https://www.cnblogs.com/#p{page}" for page in range(1, 50 + 1)]

tasks = [loop.create_task(get_url(url)) for url in urls]

loop.run_until_complete(asyncio.wait(tasks))

控制asyncio并发数

  1. try-finally
import asyncio
sem = asyncio.Semaphore(10)

await sem.acquire()
try:
    # do something
finally:
    sem.release()
  1. with
import asyncio
sem = asyncio.Semaphore(10)

async with sem:
    # do something
  • 举例
import asyncio
import aiohttp

loop = asyncio.get_event_loop()

# 限制10个并发
semaphore = asyncio.Semaphore(10)


async def get_url(url):
    async with semaphore:
        async with aiohttp.ClientSession() as session:
            async with session.get(url) as resp:
                result = await resp.text()
                print(f"url:{url},{len(result)}")


urls = [f"https://www.cnblogs.com/#p{page}" for page in range(1, 50 + 1)]

tasks = [loop.create_task(get_url(url)) for url in urls]

loop.run_until_complete(asyncio.wait(tasks))

相关文章

  • 多线程多进程多协程(转载)

    多线程多进程多协程(转载) Bilibili 蚂蚁学Python UP主说得很好 工作中看视频不方便,截取重点部...

  • 并发编程之Concurrent.futures vs Multi

    并发编程是刚需,尤其是在多I/O操作时,多线程,协程,多进程三路英雄各显神通。多线程,协程属于并发操作,多进程属于...

  • python常用知识

    多线程,多进程,协程进程池 协程 字典 列表 函数 文件操作

  • Gunicorn源码分析(二)Worker进程

    Gunicorn.worker实现了不同类型的work进程,有单进程、多线程、多协程等形式。 gunicorn.w...

  • 简单了解进程、线程、协程

    当单任务不能满足工作的需要,只是需要使用多任务,多任务分为多进程,多线程,多协程 先有进程,进程创建线程,线程依附...

  • Python3 异步协程函数async具体用法

    之前使用Python的人往往纠缠在多线程,多进程,评判哪个效率更高?其实,相对于别家的协程和异步,不管多线程还是多...

  • 浅析python的GIL

    Python中的GIL锁 在Python中,可以通过多进程、多线程和多协程来实现多任务。 在多线程的实现过程中,为...

  • python多线程、多进程、协程的使用

    python多线程、多进程、协程的使用 本文主要介绍多线程、多进程、协程的最常见使用,每个的详细说明与介绍有时间会...

  • Gevent高并发网络库精解

    进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在python...

  • Gevent

    前述 进程 线程 协程 异步 并发编程(不是并行)目前有四种方式:多进程、多线程、协程和异步。 多进程编程在pyt...

网友评论

      本文标题:多线程多进程多协程(转载)

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