您的位置:

Python多线程:提升程序运行效率的利器

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多线程技术提升程序执行效率,提高应用的并发执行能力。