Python是一种高级编程语言,开发速度快、易于阅读和编写,是许多开发者手头最爱的语言之一。但是它的单线程执行使得开发者在处理大规模数据时遇到了很大的问题。Python多线程技术的引入,能够使得程序在执行时同时处理多个任务,提升程序运行效率。本文将详细介绍Python多线程技术的应用和使用。
一、Python多线程的特点
Python多线程允许我们在单个程序中同时运行多个线程,从而实现应用并发执行的同时优化资源所有权。Python多线程技术的特点包括:
1、提升程序运行效率:多线程技术可以同时处理多个任务,加速程序运行。而在单线程执行中,需要等到当前任务执行完毕才能执行下一任务,执行效率较低。
import threading import time def worker(): print(threading.current_thread(), 'start') time.sleep(1) print(threading.current_thread(), 'end') threads = [] for i in range(5): t = threading.Thread(target=worker) threads.append(t) for t in threads: t.start()
2、优化资源利用:多线程技术可以充分利用计算机硬件资源,让多个线程并行处理任务,从而减少资源浪费。
import threading import time def worker(): lock.acquire() print(threading.current_thread(), 'get lock') time.sleep(1) lock.release() print(threading.current_thread(), 'release lock') lock = threading.Lock() threads = [] for i in range(5): t = threading.Thread(target=worker) threads.append(t) for t in threads: t.start()
3、提高系统可靠性:多线程技术可以将任务分解为多个子任务并行执行,从而减小系统瘫痪的风险。例如,一个子线程挂掉不会影响其他子线程的执行。
import threading import time def worker(): print(threading.current_thread(), 'start') time.sleep(1) print(1/0) print(threading.current_thread(), 'end') threads = [] for i in range(5): t = threading.Thread(target=worker) threads.append(t) for t in threads: t.start()
二、Python多线程的实现
Python多线程的实现依赖于threading库,它可以很方便地开启多个线程,从而实现应用并发执行的同时优化资源所有权。以下是Python多线程实现的基本流程:
1、引入threading库,创建一个线程。
import threading # 创建一个线程t1并执行 def fn(): print('这是一个线程') t1 = threading.Thread(target=fn) t1.start()
2、通过继承Thread类实现线程。
import threading # 通过继承Thread类实现 class MyThread(threading.Thread): def __init__(self,name): super().__init__(name=name) def run(self): print('这是一个线程') t1 = MyThread('thread1') t1.start()
3、通过创建线程池实现。
import threading import time from concurrent.futures import ThreadPoolExecutor def worker(number): print('Thread {} starts'.format(number)) time.sleep(1) print('Thread {} ends'.format(number)) executor = ThreadPoolExecutor(max_workers=5) for i in range(5): executor.submit(worker, i) executor.shutdown()
三、Python多线程案例实战
Python多线程技术可以应用于许多场景中,本文将详细介绍两个案例实战:
1、数据爬取应用案例。多线程技术可以在一定程度上提高爬虫的效率,当多个线程并发执行时,可以减少单个线程处理请求的等待时间,提高整个爬虫程序的运行速度。
import requests import threading from queue import Queue class CrawlThread(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): while True: url = self.queue.get() try: r = requests.get(url) print(r.content) except Exception as e: print(e) self.queue.task_done() queue = Queue() for i in range(5): t = CrawlThread(queue) t.setDaemon(True) t.start() for j in range(10): queue.put('http://www.baidu.com/') queue.join()
2、并发下载器应用案例。当我们需要下载大量文件时,多线程技术可以显著提高下载速度。
import requests import threading import os class DownloadThread(threading.Thread): def __init__(self, url, start, end, file): threading.Thread.__init__(self) self.url = url self.start = start self.end = end self.file = file def run(self): headers = {'Range': 'bytes={}-{}'.format(self.start, self.end)} r = requests.get(self.url, headers=headers, stream=True) self.file.seek(self.start) self.file.write(r.content) url = 'https://www.python.org/ftp/python/3.8.0/Python-3.8.0.tar.xz' thread_count = 4 r = requests.head(url) content_length = int(r.headers['Content-Length']) length_per_thread = content_length // thread_count file = open('Python-3.8.0.tar.xz', 'wb') threads = [] for i in range(thread_count): start = i * length_per_thread end = start + length_per_thread - 1 if i != thread_count - 1 else None thread = DownloadThread(url, start, end, file) thread.start() threads.append(thread) for thread in threads: thread.join() file.close()
总结
本文通过介绍Python多线程技术的特点、实现和案例实战,详细阐述了Python多线程技术的用法和应用场景,旨在帮助开发者更好地利用Python多线程技术提升程序执行效率,提高应用的并发执行能力。