Python并发的目的是利用多个CPU核心,使程序在相同时间内完成更多的任务,从而提高程序的执行效率。并发可以通过多进程、多线程、协程等多种方式实现。
下面分别讲解这些并发方式以及使用方法:
多进程
多进程是指启动多个独立的进程来进行并发处理,每个进程有独立的内存空间,因此可以利用多核CPU来实现并发。Python中通过multiprocessing
模块来实现多进程,具体代码如下:
import multiprocessing
def worker(num):
"""示例进程函数"""
print('Worker', num)
if __name__ == '__main__':
for i in range(5):
p = multiprocessing.Process(target=worker, args=(i,))
p.start()
上述代码通过创建5个进程来运行worker
函数,并将0~4
这5个数字作为参数传递给worker
函数,从而实现了多进程并发。
多线程
多线程是指在同一进程中启动多个独立的线程来进行并发处理,线程共享进程的内存空间,因此可以利用单核CPU来实现并发。Python中通过threading
模块来实现多线程,具体代码如下:
import threading
def worker(num):
"""示例线程函数"""
print('Worker', num)
if __name__ == '__main__':
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
t.start()
上述代码同样启动了5个并发的任务,每个任务通过一个线程来执行,从而实现了多线程并发。
协程
协程是一种轻量级的线程,可以实现在单线程中并发执行多个子任务,协程没有多线程的锁机制,可以利用更少的资源来实现并发。Python中有多种协程库,例如gevent
、asyncio
等。以下是一个使用asyncio
库的示例:
import asyncio
async def worker(num):
"""示例协程函数"""
print('Worker', num)
await asyncio.sleep(1) # 等待1秒
async def main():
"""示例主函数"""
tasks = []
for i in range(5):
tasks.append(asyncio.create_task(worker(i))) # 添加5个协程任务
await asyncio.gather(*tasks)
if __name__ == '__main__':
asyncio.run(main())
上述代码通过asyncio.create_task
方法创建了5个协程任务,并通过asyncio.gather
方法将5个协程任务加入事件循环中并等待执行完成。协程任务的执行需要依靠事件循环,因此需要在程序的入口处使用asyncio.run
方法启动事件循环。
这些就是Python进行并发处理的几种常见方式,需要根据具体的场景选择适合的并发方式来提高程序的执行效率。