人生苦短,我用Python 九:Flask接口并发处理:多进程、多线程

这篇具有很好参考价值的文章主要介绍了人生苦短,我用Python 九:Flask接口并发处理:多进程、多线程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发环境

Windows

一、任务需求

我现在有一个flask接口文件,我有个需求:,
让这个接口可以并发处理10个请求任务,每个任务中有7个子线程任务,这7个子线程任务,为的是加快,每个请求任务的处理速度。

简单介绍

1. 进程

进程是操作系统中的一个基本概念,用于描述正在运行的程序。简单来说,进程是计算机中正在进行中的一个任务或程序的实例。可以把进程类比为在电脑上同时运行的多个应用程序。每个应用程序都可以看作是一个独立的进程,它们在操作系统内部占用资源(如CPU、内存等),并通过调度算法由处理器进行切换,以实现并发执行。

进程的应用场景非常广泛,包括但不限于:

  1. 多任务处理:操作系统可以同时运行多个进程,每个进程处理不同的任务,提高了计算机的效率。
  2. 并发编程:在编写程序时,可以利用多进程来实现并发执行,提高程序的响应能力和处理能力。
  3. 分布式计算:在分布式系统中,可以将一个大型计算任务划分成多个子任务,分配给不同的进程来并行处理。
  4. 服务器应用:对于需要处理大量并发请求的服务端应用,使用多进程可以提供更好的性能和可伸缩性。
    以下是一个示例代码,展示了如何使用Python的multiprocessing库创建并启动一个进程:
import multiprocessing

def my_process():
    # 这里是进程需要执行的逻辑
    pass

if __name__ == '__main__':
    process = multiprocessing.Process(target=my_process)
    process.start()
    process.join()

在这个示例中,我们通过multiprocessing.Process创建了一个进程,并将其目标函数设置为my_process。然后使用start()方法启动进程,并使用join()方法等待进程执行完毕。

需要注意的是,每个进程都有自己独立的内存空间和系统资源,进程间的通信需要借助特定的机制(如共享内存、管道等)。此外,在使用多进程时还需注意以下事项:

  1. 进程的创建和销毁涉及系统开销,因此过多的进程可能会影响系统性能。
  2. 不同进程之间的数据和状态无法直接共享,需要通过进程间通信(IPC)方式进行数据交换。
  3. 多进程编程需要考虑进程间的同步与互斥,以避免竞态条件和资源冲突。
  4. 在某些操作系统上,每个进程都有一定的资源限制,如虚拟内存、文件描述符等,需要注意合理分配和利用。
  5. 进程是操作系统中的基本概念,用于描述并发运行的程序实例,可以提供更好的任务隔离性、资源管理和并发处理能力。

2. 线程

线程是操作系统中的另一个基本概念,用于描述进程内部的执行流。简单来说,线程是进程中独立执行的一段指令序列。

通俗来讲,可以把线程类比为在应用程序内同时执行的多个子任务。每个子任务都可以看作是一个独立的线程,它们共享相同的内存空间和资源,在进程内部并发执行。

线程的应用场景包括但不限于以下几个方面:

  1. 并发编程:线程可实现并发处理,提高程序的响应能力和处理能力。特别适用于需要同时处理多个任务且任务之间没有强依赖关系的场景。
  2. 资源共享:由于线程共享进程的地址空间和资源,因此可以方便地进行数据共享和协同处理,提高程序的效率。
  3. 用户界面交互:在GUI应用程序中,可以使用主线程处理用户界面的渲染和事件响应,而使用其他线程执行耗时任务,避免界面卡顿。
  4. 多媒体处理:对于需要实时处理音视频数据的应用,可以使用线程来并发执行解码、编码、渲染等任务。
    下面是一个示例代码,展示了如何使用Pythonthreading库创建并启动一个线程:
import threading

def my_thread():
    # 这里是线程需要执行的逻辑
    pass

if __name__ == '__main__':
    thread = threading.Thread(target=my_thread)
    thread.start()
    thread.join()

在这个示例中,我们通过threading.Thread创建了一个线程,并将其目标函数设置为my_thread。然后使用start()方法启动线程,并使用join()方法等待线程执行完毕。

需要注意的是,线程是在进程内部共享资源的并发执行单位,因此需要特别关注以下事项:

  1. 线程间共享数据需要进行同步和互斥操作,以避免竞态条件和数据一致性问题。
  2. 在多线程编程中,需要注意线程安全性,尽量避免使用共享状态和全局变量,或者采用线程安全的数据结构和同步机制。
  3. 线程的创建和销毁开销较小,但过多的线程可能会导致资源浪费和线程调度开销增加。
  4. 由于线程共享进程的资源,因此一个线程的错误可能会影响到其他线程和整个进程的稳定性。
  5. 线程是进程内部独立执行的指令序列,可以提供更好的并发处理能力和资源共享。合理地利用线程可以提高程序的效率和响应能力,但也需要注意线程间的同步和互斥,以及线程安全性的问题。

二、多线程处理7个子任务

使用Python中的threading库来并发处理子线程任务

from flask import Flask
import threading

app = Flask(__name__)

def process_sub_task():
    # 这里是每个子线程任务需要执行的逻辑
    pass

@app.route('/', methods=['GET'])
def handle_request():
    threads = []
    for _ in range(7):
        thread = threading.Thread(target=process_sub_task)
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

    return 'Request processed successfully'

if __name__ == '__main__':
    app.run(threaded=True)

handle_request函数仍然是接口的入口点。当收到一个请求时,它会创建7个子线程,并将每个子线程的目标函数设置为process_sub_task

process_sub_task函数内部,你可以编写具体的处理逻辑,根据需要执行相应的操作。

通过这种方式,你可以同时并发处理7个子线程任务,以加快每个请求任务的处理速度。每个子线程在自己的上下文中独立执行,以实现并行处理。

三、并发处理10个进程任务

下面是一个示例代码,展示了如何使用线程池来实现并发处理10个任务:

from flask import Flask
import multiprocessing

app = Flask(__name__)

def process_request():
    # 这里是每个进程请求任务需要执行的逻辑
    pass

@app.route('/', methods=['GET'])
def handle_request():
    processes = []
    for _ in range(10):
        process = multiprocessing.Process(target=process_request)
        processes.append(process)
        process.start()

    for process in processes:
        process.join()

    return 'Request processed successfully'

if __name__ == '__main__':
    app.run(threaded=True)

handle_request函数仍然是接口的入口点。当收到一个请求时,它会创建10个进程,并将每个进程的目标函数设置为process_request

process_request函数内部,你可以编写具体的处理逻辑,根据需要执行相应的操作。

通过这种方式,你可以同时并发处理10个进程请求任务。每个进程在自己的上下文中独立执行,以实现并行处理。

四、综合处理多进程、多线程(任务需求)

from flask import Flask
import multiprocessing
import threading

app = Flask(__name__)

def process_sub_task():
    # 这里是每个子线程任务需要执行的逻辑
    pass

def process_request():
    threads = []
    for _ in range(7):
        thread = threading.Thread(target=process_sub_task)
        threads.append(thread)
        thread.start()

    for thread in threads:
        thread.join()

@app.route('/', methods=['GET'])
def handle_request():
    processes = []
    for _ in range(10):
        process = multiprocessing.Process(target=process_request)
        processes.append(process)
        process.start()

    for process in processes:
        process.join()

    return 'Request processed successfully'

if __name__ == '__main__':
    app.run(threaded=True)

在这个示例代码中,handle_request函数仍然是接口的入口点。当收到一个请求时,它会创建10个进程,并将每个进程的目标函数设置为process_request

process_request函数内部,我们又创建了7个子线程来并发处理任务,每个任务执行process_sub_task函数。

通过这种方式,你可以同时并发处理10个进程请求任务,并且每个进程任务内部有7个子线程来加快处理速度。每个进程和线程在自己的上下文中独立执行,以实现并行和加速处理。文章来源地址https://www.toymoban.com/news/detail-668793.html

到了这里,关于人生苦短,我用Python 九:Flask接口并发处理:多进程、多线程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《人生苦短,我学Python》——列表(List)

    昨天,我们学习了一种数据结构—— 元组 。今天我们将学习另一种数据结构—— 列表 。 列表又叫 List ,与元组的结构类似,也可以用于存储多个类型的数据。接下来,我们一起学习列表的用法– 我们通过下面这段代码来理解列表的相关知识: friendName :变量名,用来存储这

    2024年02月09日
    浏览(41)
  • 《人生苦短,我学Python》——第一个python程序

    Hello!朋友们大家好,从今天开始,我们将学习 Python 的相关内容。 首先,让我们来思考一个问题,编程是什么? 编程是人类与电脑沟通的过程,可以告诉电脑做什么以及怎么做。人类用编程构建数字世界,比如网站、App、办公软件等等。 世界上有很多种编程语言,比如C,

    2024年02月11日
    浏览(45)
  • 《人生苦短,我学Python》——数据类型 & 运算符

    Hello,朋友们,大家好啊,前面我们学习了 变量 , 常量 , 输入输出 的相关知识,今天我们就来深入剖析一些Python中的 数据类型 和 运算符 吧。Let’s go!!! ✨定义:在Python中,整型是用来表示整数的数据类型, 是编程语言里用来呈现和存储整数的一种方式。 整数在Python的世

    2024年02月10日
    浏览(45)
  • 用Python实现艺术绘画,人生苦短,代码赛高

    艺术绘画是一个创造性的过程,包括绘画、素描和绘画。借助Python编程语言,您可以模拟艺术绘画的过程。该过程包括以下步骤: 1. 导入所需的库 -您需要导入NumPy、OpenCV和Matplotlib等库来执行图像处理任务。 2. 加载图像 -您可以使用OpenCV加载图像。 3. 应用过滤器和效果 -您可

    2024年02月03日
    浏览(51)
  • 《人生苦短——我学Python》条件判断->双向选择(if--else)

    今天我们来学习双向选择判断。顾名思义,双向就是两种选择选其一,即 if----else 。如果If的条件不成立,则执行 else 下的语句,否则执行 if 下面的语句。显然,它们是 互斥 的!下面就让我们来详细看看吧! if 后面的语句是当判断 条件成立 时, 需要执行 的操作。 else 后面

    2024年02月10日
    浏览(40)
  • 【python】我用python写了一个可以批量查询文章质量分的小项目(纯python、flask+html、打包成exe文件)

    web 效果预览: 先去质量查询地址:https://www.csdn.net/qc 输入任意一篇文章地址进行查询,同时检查页面,在Network选项下即可看到调用的API的请求地址、请求方法、请求头、请求体等内容: 请求头里面很多参数是不需要的,我们用 ApiPost 这个软件来测试哪些是必要参数。 经过

    2024年02月13日
    浏览(40)
  • selenium并发处理多个窗口线程/进程任务

    这里以百度搜索为例,通过不同的浏览器来启动不同的线程。

    2024年01月20日
    浏览(42)
  • 【linux 多线程并发】多线程模型下的信号通信处理,与多进程处理的比较,属于相同进程的线程信号分发机制

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年01月17日
    浏览(49)
  • Python并发编程之进程理论

    本文将详细介绍 进程 相关概念。 计算机上的未运行的QQ、Wechat等都属于程序,但是一旦当这些程序运行起来的话,就可以被称为进程。因此可以如下定义程序和进程: 程序:就是存在硬盘上的一堆代码。 进程:就是正在运行的程序。 程序就是一堆代码的集合,本身并没有

    2024年02月03日
    浏览(34)
  • python-16-线程池和进程池python并发编程

    Python ThreadPoolExecutor线程池 线程池的基本原理是什么? 利用Python快速实现一个线程池,非常简单 Python并发编程专题 一、为什么要引入并发编程? 场景1:一个网络爬虫,按顺序爬取花了1小时,采用并发下载减少到20分钟! 场景2:一个APP应用,优化前每次打开页面需要3秒,采

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包