Python 并发指的是在一个程序中同时运行多个独立的任务。这些任务可以是在同一个 CPU 核心上交替执行的,也可以是在多个 CPU 或者多台机器上同时执行的。使用Python 并发可以提高程序的效率,缩短程序的运行时间。
并发的意义
在Python中使用并发,可以帮助我们更有效地利用计算资源。例如,如果你需要下载一些文件,你可以并发地下载这些文件,这样就可以在短时间内完成任务。并发还可以处理大量同时到达的请求,例如Web服务器处理多个HTTP请求,或者对多个客户端进行数据处理等。
并发的使用方法
在 Python 中有多种并发实现方式,如多线程、多进程、协程、异步 IO 等。下面分别介绍两个示例,一个使用多线程,一个使用协程。
多线程示例
下面是一个简单的多线程示例,从网上下载多个图片并保存到本地:
import requests
import threading
def download(url, filename):
r = requests.get(url)
with open(filename, 'wb') as f:
f.write(r.content)
urls = [
'https://www.python.org/static/community_logos/python-logo-master-v3-TM.png',
'https://www.python.org/static/community_logos/python-powered-w-200x80.png',
'https://www.python.org/static/community_logos/python-logo-title-dark.png'
]
threads = []
for i, url in enumerate(urls):
filename = f'python_logo_{i}.png'
t = threading.Thread(target=download, args=(url, filename))
threads.append(t)
t.start()
for t in threads:
t.join()
print('下载完成')
代码中首先定义了下载函数download,接着定义了3个需要下载的图片的URL地址,然后创建多个线程并行下载这些图片。最后在所有线程都完成下载操作之后输出提示信息。
协程示例
下面是一个简单的协程示例,从网上下载多个图片并保存到本地:
import asyncio
import aiohttp
async def download(url, filename):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
async with aiofiles.open(filename, 'wb') as f:
while True:
chunk = await resp.content.read(1024)
if not chunk:
break
await f.write(chunk)
async def main():
urls = [
'https://www.python.org/static/community_logos/python-logo-master-v3-TM.png',
'https://www.python.org/static/community_logos/python-powered-w-200x80.png',
'https://www.python.org/static/community_logos/python-logo-title-dark.png'
]
tasks = [download(url, f'python_logo_{i}.png') for i, url in enumerate(urls)]
await asyncio.gather(*tasks)
print('开始下载')
asyncio.run(main())
print('下载完成')
代码中首先定义了下载函数download,接着定义了3个需要下载的图片的URL地址,然后创建多个协程并行下载这些图片。最后在所有协程都完成下载操作之后输出提示信息。
总结
在Python中使用并发可以提高程序的效率,缩短程序的运行时间。Python支持多种并发实现方式,如多线程、多进程、协程、异步 IO 等。使用具体的并发方式需要根据实际场景选择。