在 Python 中使用 多线程 Multithreading, 多进程 Multiprocessing

简介: 线程 Thread / 进程 Process进程一个正在运行的程序进程间内存不共享,通过进程间通信等传递信息线程被包含在进程之中,独立执行相同程序运算调度的最小单位,宏观并行,微观分时切换串行共享同一份全局内存区域创建线程比创建进程通常要快10倍甚至更多线程/进程 池一种管理工具(方法/思想)尽可能减少创建和销毁线程的次数,从而减少时间和资源消耗池化思想复用资源,减少创建和释放的资源消耗对象池、连

线程 Thread / 进程 Process

进程

  • 一个正在运行的程序
  • 进程间内存不共享,通过进程间通信等传递信息

线程

  • 被包含在进程之中,独立执行相同程序
  • 运算调度的最小单位, 宏观并行,微观分时切换串行
  • 共享同一份全局内存区域
  • 创建线程比创建进程通常要快10倍甚至更多

线程/进程 池

  • 一种管理工具 ( 方法 / 思想 )
  • 尽可能减少创建和销毁线程的次数,从而减少时间和资源消耗

池化思想

  • 复用资源,减少创建和释放的资源消耗
  • 对象池、连接池、内存池、线程池

Python 中 线程 Thread / 进程 Process 的使用

最常用的两种方式

ThreadPoolExecutor

ProcessPoolExecutor

使用“池”完成一组同类型任务

executor.map 会保持顺序

multiprocessing.Process

新建进程启动任意任务

例子:

ThreadPoolExecutor

from concurrent.futures import ThreadPoolExecutor

def main():
    with ThreadPoolExecutor() as executor:
        executor.map(download, links, timeout=30)

ProcessPoolExecutor

from concurrent.futures import ProcessPoolExecutor

def main():
    with ProcessPoolExecutor as executor:
        executor.map(is_prime, PRIMES)

具体 API 参考:concurrent.futures — Launching parallel tasks — Python 3.9.4 documentation

Process 

from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

具体 API 参考:multiprocessing — Process-based parallelism — Python 3.9.4 documentation

Multithreading vs Multiprocessing 

IO bound

multithreading (less overhead), multiprocessing 

CPU bound

multiprocessing

multiple machines

RQ

对于 IO 密集型的任务,使用线程和进程均可,使用线程可以减少资源消耗

对于 CPU 密集型的任务,使用进程

优化

使用全局变量

或 multiprocessing.Queue

Don't pickle the input, This will save a lot of communication overhead, especially if the output is small compared to the input

使用 chunk

ProcessPoolExecutor.map(chunksize =x)

对于大量小计算量任务,使用 chunk 充分利用 Process 资源,减少 overhead

常见问题

死锁

the function needs to be defined at the top-level, nested functions won't be importable by the child and already trying to pickle them raises an exception

Reference

线程池源码浅析 (Java)

线程概念,Java ThreadPoolExecutor

Don't pickle the input (stackoverflow)

 

https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing

官网文档

https://docs.python.org/3/library/threading.html

官网文档

Python Multithreading and Multiprocessing Tutorial

操作系统导论

 

目录
相关文章
|
5月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
5月前
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
204 0
|
2月前
|
Java 测试技术 API
【JUC】(1)带你重新认识进程与线程!!让你深层次了解线程运行的睡眠与打断!!
JUC是什么?你可以说它就是研究Java方面的并发过程。本篇是JUC专栏的第一章!带你了解并行与并发、线程与程序、线程的启动与休眠、打断和等待!全是干货!快快快!
539 2
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
221 1
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
300 0
|
4月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
329 1
|
5月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
6月前
|
JSON 算法 Java
打造终端里的下载利器:Python实现可恢复式多线程下载器
在数字时代,大文件下载已成为日常需求。本文教你用Python打造专业级下载器,支持断点续传、多线程加速、速度限制等功能,显著提升终端下载体验。内容涵盖智能续传、多线程分块下载、限速控制及Rich库构建现代终端界面,助你从零构建高效下载工具。
413 1
|
5月前
|
数据采集 存储 Java
多线程Python爬虫:加速大规模学术文献采集
多线程Python爬虫:加速大规模学术文献采集

热门文章

最新文章

推荐镜像

更多