Python 并发的意义和使用方法
并发的意义
并发指的是同时执行多个任务。在 Python 中进行并发,通常是为了提高程序的效率和性能。
使用并发可以将不相关的任务独立运行,提高了程序的响应速度,同时减少了系统资源的浪费。
Python 并发的使用方法
在 Python 中实现并发有多种方式,其中比较常用的是以下几种:
1. 线程
线程是操作系统能够进行运算调度的最小单位,它比进程具有更轻量级、更高效的特点。
Python 中的 threading
模块提供了对线程的支持。可以通过继承 threading.Thread
类并重写 run()
方法来创建线程,然后调用 start()
方法实现启动线程。以下是一个示例代码:
import threading
class MyThread(threading.Thread):
def __init__(self, name):
super(MyThread,self).__init__()
self.name = name
def run(self):
print("thread start:", self.name)
print("thread end:", self.name)
for i in range(3):
thread = MyThread(str(i))
thread.start()
2. 进程
Python 中的 multiprocessing
模块提供了对进程的支持。与线程不同,进程可以在多个 CPU 上运行,并且可以最大程度地利用系统资源。
使用 multiprocessing.Process
类可以创建进程,然后调用 start()
方法实现启动进程。以下是一个示例代码:
from multiprocessing import Process
def func(name):
print("process start:", name)
print("process end:", name)
for i in range(3):
process = Process(target=func, args=(str(i),))
process.start()
示例说明
示例1:通过多线程下载文件
多线程可以用于并发下载,从而提高下载速度。以下是一个示例代码:
import requests
import threading
# 下载函数
def download(url, filename):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36'}
res = requests.get(url, headers=headers)
with open(filename, 'wb') as f:
f.write(res.content)
# 主函数
if __name__ == '__main__':
urls = [
'http://www.example.com/file1.zip',
'http://www.example.com/file2.zip',
'http://www.example.com/file3.zip',
]
threads = []
for i, url in enumerate(urls):
# 每个文件使用一个线程下载
thread = threading.Thread(target=download, args=(url, f'file_{i+1}.zip'))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
示例2:通过多进程处理数据
多进程可以用于并发处理数据,从而加快处理速度。以下是一个示例代码:
from multiprocessing import Pool
# 处理函数
def func(x):
return x**2
# 主函数
if __name__ == '__main__':
data = [1, 2, 3, 4, 5]
with Pool(2) as pool:
results = pool.map(func, data)
print(results)
在这个示例中,Pool(2)
创建了一个包含 2 个进程的进程池,pool.map()
方法将数据列表 data
中的每个元素都传递给处理函数 func()
进行处理,并返回每个元素处理后的结果,最后将结果打印出来。