当然,以下是多进程和多线程在Python中的实际应用示例:
多线程实际应用:Web服务器
场景:一个简单的Web服务器需要处理多个客户端的HTTP请求。
代码示例:
from http.server import BaseHTTPRequestHandler, HTTPServer
from threading import Thread
class RequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'Hello, world!')
def run_server(port):
server_address = ('', port)
httpd = HTTPServer(server_address, RequestHandler)
httpd.serve_forever()
if __name__ == '__main__':
port = 8000
t = Thread(target=run_server, args=(port,))
t.daemon = True
t.start()
print(f"Server running on port {port}")
在这个例子中,我们创建了一个多线程的Web服务器,它可以同时处理多个客户端请求。每个请求都在一个新的线程中处理,而主线程继续监听新的请求。
多进程实际应用:图像处理
场景:一个图像处理程序需要对多张图片进行滤镜处理。
代码示例:
from multiprocessing import Pool
from PIL import Image, ImageFilter
def apply_filter(image_path):
image = Image.open(image_path)
filtered_image = image.filter(ImageFilter.GaussianBlur(5))
filtered_image.save(image_path.replace('.jpg', '_filtered.jpg'))
if __name__ == '__main__':
image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg']
with Pool(4) as p: # 使用4个进程
p.map(apply_filter, image_paths)
在这个例子中,我们使用multiprocessing
模块创建了一个进程池,每个进程负责对一张图片应用高斯模糊滤镜。由于图像处理是CPU密集型的,使用多进程可以充分利用多核CPU,加速处理过程。
多线程和多进程结合实际应用:爬虫
场景:一个爬虫程序需要同时从多个网站下载数据。
代码示例:
from concurrent.futures import ThreadPoolExecutor
import requests
def fetch_url(url):
response = requests.get(url)
return response.text
if __name__ == '__main__':
urls = ["http://example.com", "http://example.org", "http://example.net"]
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(fetch_url, url) for url in urls]
for future in futures:
content = future.result()
print(content) # 处理下载的内容
在这个例子中,我们使用concurrent.futures.ThreadPoolExecutor
创建了一个线程池来并发地从多个网站下载数据。对于每个URL,我们启动一个线程来处理HTTP请求。这个例子展示了如何将多线程用于I/O密集型任务,以提高爬虫的效率。
这些例子展示了多进程和多线程在不同场景下的实际应用,以及它们如何帮助提高程序的性能和响应性。