介绍并发编程中多进程,多线程,协程的概念和使用
基本概念
在Python中,进程、线程和协程都是用于实现并发和并行编程的概念,但它们在实现方式、资源占用和应用场景等方面有所不同。
1.进程(Process)
进程是操作系统分配资源和调度任务的基本单位。每个进程都有自己的独立内存空间,进程间的通信需要特殊的机制。在 Python 中, 可以使用 multiprocessing 模块创建和管理多个进程。每个进程都有自己独立的 Python 解释器,因此进程之间不会共享全局变量。
2.线程(Thread)
线程是进程内的最小任务单元,它们共享同一进程的资源,包括内存空间。由于线程共享内存,因此线程之间的通信和同步相对比较容易。 Python 中的 threading 模块可以用于创建和管理多个线程。
3.协程(Coroutine)
协程是一种轻量级的线程,是由用户控制的,可以随时挂起和恢复。协程通常用于实现高效的异步编程,允许在单个线程中实现并发。 在 Python 3.5 及之后的版本中,可以使用 asyncio 模块来实现协程,利用关键字 async 和 await 来定义和调用异步函数。
用例
1.进程示例
import multiprocessing
def worker1():
print("Worker 1 executing")
def worker2():
print("Worker 2 executing")
if __name__ == "__main__":
process1 = multiprocessing.Process(target=worker1)
process2 = multiprocessing.Process(target=worker2)
process1.start()
process2.start()
process1.join()
process2.join()
print("Both processes are done")
2.线程示例
import threading
def worker1():
print("Worker 1 executing")
def worker2():
print("Worker 2 executing")
if __name__ == "__main__":
thread1 = threading.Thread(target=worker1)
thread2 = threading.Thread(target=worker2)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("Both threads are done")
3.协程使用
import asyncio
async def worker1():
print("Worker 1 executing")
await asyncio.sleep(1)
print("Worker 1 done")
async def worker2():
print("Worker 2 executing")
await asyncio.sleep(2)
print("Worker 2 done")
async def main():
await asyncio.gather(worker1(), worker2())
if __name__ == "__main__":
asyncio.run(main())
Eventloop 是asyncio应用的核心,把一些异步函数注册到这个事件循环上,事件循环会循环执行这些函数,当执行到某个函数时,如果它正在等待I/O返回, 如它正在进行网络请求,或者sleep操作,事件循环会暂停它的执行去执行其他的函数;当某个函数完成I/O后会恢复,下次循环到它的时候继续执行。 因此,这些异步函数可以协同(Cooperative)运行,这就是事件循环的目标。
应用场景
使用多进程:当需要执行 CPU 密集型任务时,可以使用多进程来利用多个 CPU 核心。
使用多线程:当需要执行 I/O 密集型任务时,可以使用多线程来提高任务的响应性能。
使用协程:当需要在单个线程内执行高效的异步编程时,可以使用协程来减少线程切换开销。
需要根据具体的应用场景和性能需求选择适当的并发编程方式。
文档信息
- 本文作者:onefeng
- 本文链接:https://me.onefeng.xyz/2022/10/02/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)