本文,我们将介绍进程、协程、线程、多道技术和单核并发的相关概念。
基础概念
进程
进程是指操作系统执行的一个程序,它是操作系统分配内存和资源的单位。
每个进程都有自己的内存空间,因此它们之间是独立的。
在Python中,我们可以使用multiprocessing模块来创建和管理进程。
协程
协程是一种非常特殊的进程,它不需要操作系统为其分配独立的内存空间,并且它们可以在单个进程中并行执行。
协程最常用的应用,是实现高效的异步编程。
在Python中,我们可以使用asyncio模块来实现协程。
线程
线程是操作系统执行的一个任务,它可以在一个进程内部并行执行。
线程之间共享进程的内存空间,因此它们可以非常容易地协作。
在Python中,我们可以使用threading模块来实现线程。
单核并发
单核并发是指同时处理多个任务,但实际上是在不同时刻分配给单个处理器执行。
单核并发,是通过上下文切换实现的。即,操作系统通过快速地在不同任务之间切换来模拟并行执行。
在Python中,我们可以使用多线程实现单核并发。
多道技术
多道技术,是单核并发的解决方案。是为了解决单核计算机的并发问题而实现的技术。它通过空间复用和时间复用来实现多个程序的同时运行。
空间复用:是指在内存中同时运行多个程序。比如,打开一个应用程序时,操作系统从硬盘读取文件并复制到内存中,然后由CPU读取并执行。
时间复用:是指在多个程序间切换时间片来实现多个程序的同时运行。比如,下载文件时,把文件分成多个小块并分别由多个进程下载,在遇到阻塞时会切换到其他小块,完成下载后再回来继续下载。同时,如果进程的占用时间过长,也会切换到其他进程。在切换前会保存当前进程的状态,以便下次切换回来继续运行。
案例
多线程
来一个多线程的案例
import threading
import time
def worker(num):
print("Worker %s is running" % num)
time.sleep(30)
print("Worker %s has finished" % num)
threads = []
for i in range(50):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
for t in threads:
t.join()
print("All workers have finished")
如果用单线程,worker们需要一个一个逐一完成工作。 而多线程,worker们会同时开始工作,效率会提升很多
joblib - Parallel
还有一个joblib的Parallel库
Parallel
是joblib
库的一个函数,用于并行执行函数,而threading
是Python标准库中的一个模块,用于线程编程。
它们的联系在于,Parallel
可以使用多线程实现并行执行,同时它抽象了线程的使用方式,开发者不必编写复杂的线程代码,可以方便地实现多线程并行计算。但是由于Parallel
只能执行CPU密集型任务,对于I/O密集型任务,性能提升效果不是很明显,此时需要使用其他方法,如多协程或多进程。
这个库,我们在后面的文章中再仔细分析。
多协程
import asyncio
async def worker(num):
print(f"Worker {num} started")
await asyncio.sleep(10)
print(f"Worker {num} finished")
async def main():
tasks = []
for i in range(50):
task = asyncio.create_task(worker(i))
tasks.append(task)
await asyncio.gather(*tasks)
if __name__ == "__main__":
asyncio.run(main())
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情