超实用!!!Python并发编程精髓(python3并发)

liftword4个月前 (01-24)技术文章26
#小伙伴们,大家好!今天猿梦家要带大家探索的是Python并发编程的精髓。
在编写程序时,我们经常会遇到需要同时处理多个任务的情况,这时候并发编程就派上用场了。
通过并发编程,我们可以提高程序的运行效率,让程序“一心多用”。
接下来,咱们就一起揭开并发编程的神秘面纱吧!

## 一、并发与并行

在开始之前,咱们得先弄清楚两个概念:**并发**和**并行**。

- **并发**:指的是多个任务交替进行,给人一种“同时”进行的感觉,但实际上在某一时刻只有一个任务在执行。
- **并行**:指的是多个任务同时执行,需要多核处理器或多台机器的支持。

### 小贴士
- 并发是“同时”处理多个任务,但不一定是“同时”执行;并行则是真正的“同时”执行多个任务。

## 二、线程与进程

在Python中,实现并发编程主要有两种方式:**线程**和**进程**。

- **线程**:是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。
- **进程**:是资源分配和调度的基本单位,每个进程都有自己的地址空间、数据段、代码段等。

### 示例代码:使用`threading`模块创建线程

```python
import threading
import time

def task():
    print("任务开始")
    time.sleep(2)
    print("任务结束")

# 创建线程
thread = threading.Thread(target=task)

# 启动线程
thread.start()

# 等待线程结束
thread.join()

print("主线程结束")

运行结果

任务开始
(等待2秒)
任务结束
主线程结束

小贴士

  • 使用threading模块可以轻松地创建和管理线程。
  • thread.start()方法用于启动线程,thread.join()方法用于等待线程结束。

三、GIL与线程安全

在Python中,有一个让人又爱又恨的东西,那就是全局解释器锁(GIL)。由于GIL的存在,Python的多线程在CPython解释器下并不能真正实现并行执行,这在一定程度上限制了多线程的性能。

小贴士

  • GIL保证了线程的安全性,但也限制了多线程的并发性能。
  • 对于I/O密集型任务,多线程仍然是一个不错的选择;对于CPU密集型任务,可以考虑使用多进程或其他方式。

四、使用concurrent.futures模块

concurrent.futures模块提供了一个高级别的接口来异步执行函数,它支持线程和进程作为执行方式,并且提供了更加简洁易用的API。

示例代码:使用ThreadPoolExecutor执行线程任务

from concurrent.futures import ThreadPoolExecutor

def task(n):
    print(f"任务{n}开始")
    time.sleep(2)
    print(f"任务{n}结束")

# 创建线程池执行器
with ThreadPoolExecutor(max_workers=3) as executor:
    # 提交任务到线程池
    for i in range(5):
        executor.submit(task, i)

print("所有任务提交完毕")

运行结果

(任务交替执行的输出)
所有任务提交完毕
(等待所有任务执行完毕)

小贴士

  • ThreadPoolExecutor可以方便地管理线程池,并提供了submit方法来提交任务。
  • max_workers参数用于指定线程池中的最大线程数。

五、使用multiprocessing模块创建进程

对于CPU密集型任务,我们可以使用multiprocessing模块来创建进程,实现真正的并行执行。

示例代码:使用Process类创建进程

from multiprocessing import Process

def task():
    print("任务开始")
    # 模拟CPU密集型任务
    for i in range(10000000):
        pass
    print("任务结束")

# 创建进程
process = Process(target=task)

# 启动进程
process.start()

# 等待进程结束
process.join()

print("主进程结束")

运行结果

任务开始
(等待一段时间,任务执行完毕)
任务结束
主进程结束

小贴士

  • multiprocessing模块提供了Process类来创建和管理进程。
  • 进程之间是相互独立的,拥有各自的内存空间,因此可以实现真正的并行执行。

六、进程间通信:队列和管道

在多个进程之间传递数据,我们可以使用multiprocessing模块提供的队列(Queue)管道(Pipe)

示例代码:使用队列进行进程间通信

from multiprocessing import Process, Queue

def task(q):
    # 向队列中放入数据
    q.put("任务完成")

# 创建队列
q = Queue()

# 创建进程
process = Process(target=task, args=(q,))

# 启动进程
process.start()

# 从队列中获取数据
result = q.get()
print(result)

# 等待进程结束
process.join()

print("主进程结束")

运行结果

任务完成
主进程结束

小贴士

  • 队列和管道是进程间通信的两种常用方式,它们都可以实现数据的传递和同步。
  • 使用队列时,需要注意队列的容量和数据的类型。

总结

小伙伴们,今天咱们一起学习了Python并发编程的精髓,包括并发与并行的概念、线程与进程的区别、GIL与线程安全、concurrent.futures模块的使用、multiprocessing模块创建进程以及进程间通信的方法。这些知识都是并发编程中的核心内容,掌握它们可以让你在编写高效程序时更加得心应手。

  • 并发是多个任务交替进行,并行是多个任务同时执行。
  • 线程是操作系统调度的最小单位,进程是资源分配的基本单位。
  • GIL保证了线程的安全性,但也限制了多线程的并发性能。
  • concurrent.futures模块提供了高级别的接口来异步执行函数。
  • multiprocessing模块可以实现真正的并行执行,适用于CPU密集型任务。
  • 队列和管道是进程间通信的两种常用方式。

小伙伴们,今天的Python学习之旅就到这里啦!记得动手敲代码,尝试使用并发编程来解决实际问题。有问题随时在评论区问猿小哥哦,祝大家学习愉快,Python学习节节高!

相关文章

Python:被忽视的核心功能(python核心理念)

【编者按】这篇文章主要介绍了一些在 Python 编程中可能被忽视的核心功能,包括默认参数、海象运算符、*args 和 **kwargs 的使用、变量交换、str 与 repr 的区别、可迭代对象的扩...

Python四大主流网络编程框架,你知道么?

高并发处理框架—— TornadoTornado 是使用 Python 编写的一个强大的可扩展的 Web 服务器。它在处理高网络流量时表现得足够强健,却在创建和编写时有着足够的轻量级,并能够被用在大量...

Python 小白的自学秘籍:从入门到精通

在当今数字化的时代,Python 语言的重要性日益凸显。无论是数据分析、人工智能,还是网络开发,Python 都展现出了强大的实力。对于众多小白来说,自学 Python 似乎是一座难以逾越的高山,但其...

神仙级python入门教程(非常详细),从0到精通,从看这篇开始!

python入门虽然简单,很多新手依然卡在基础安装阶段,大部分教程对一些基础内容都是一带而过,好多新手朋友,对一些基础知识常常一知半解,需要在网上查询很久。扎实的基础知识,对之后的学习、工作都是非常必...

硬核!Python核心知识笔记(附思维导图,建议收藏),小白福利

导读:本文向大家展示一份Python核心知识笔记。该笔记通俗易懂,代码齐全,十分适合Python初学者学习借鉴,文末有获取方式。该笔记学习思维导图:目录常用数据类型函数式编程进程、线程和协程正则表达式...