在 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)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
200 0
|
2月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
290 0
|
4月前
|
数据采集 消息中间件 并行计算
Python多线程与多进程性能对比:从原理到实战的深度解析
在Python编程中,多线程与多进程是提升并发性能的关键手段。本文通过实验数据、代码示例和通俗比喻,深入解析两者在不同任务类型下的性能表现,帮助开发者科学选择并发策略,优化程序效率。
304 1
|
5月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
5月前
|
数据采集 存储 Java
多线程Python爬虫:加速大规模学术文献采集
多线程Python爬虫:加速大规模学术文献采集
|
数据采集 并行计算 安全
Python并发编程:多进程(multiprocessing模块)
在处理CPU密集型任务时,Python的全局解释器锁(GIL)可能会成为瓶颈。为了充分利用多核CPU的性能,可以使用Python的multiprocessing模块来实现多进程编程。与多线程不同,多进程可以绕过GIL,使得每个进程在自己的独立内存空间中运行,从而实现真正的并行计算。
|
Unix Linux API
Python multiprocessing模块
Python multiprocessing模块
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
在Python中,`multiprocessing`模块提供了一种在多个进程之间共享数据和同步的机制。
|
数据采集 Java Python
python并发编程:使用多进程multiprocessing模块加速程序的运行
python并发编程:使用多进程multiprocessing模块加速程序的运行
412 1

热门文章

最新文章

推荐镜像

更多