需求:
1 手机号在数据库中是使用rsa方式加密存储,后台查看中需要转换为明文,因为需要解密多个手机号,所以在后台查看中消耗时间3秒,希望通过多线程,多进程,异步方式来缩短时间
相关注意点:
Django遵循单请求模型,其中每个请求都在单个线程中处理。在Django的请求 / 响应周期中引入多线程可能无法提供预期的性能提升
据库访问是一个常见的瓶颈,如果数据库连接池不是线程安全的,或者数据库服务器本身无法有效地处理并发连接,则引入多线程可能没有好处。
1:使用异步方式 进行手机号解密--消耗时间1秒
但是,在后台中无法显示手机号
2:使用多线程进行手机号进行解密,消耗时间3秒
3使用多进程来进行手机号解密--直接报错
额,我技术差
4:普通调用对手机号进行解密:消耗3秒
结论:普通调用就好,不用多线程,多进程,异步了
1:使用异步方式 进行手机号解密--消耗时间1秒
但是,在后台中无法显示手机号
python
# -------------------------------------------------------------------------------------
# 手机号解密
# 使用异步方式
async def decrypt_data_async(self, data):
# 读取私钥文件
private_key="""-----BEGIN RSA PRIVATE KEY-----
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""
key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())
decrypted_data = key.decrypt(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)).decode('utf-8')
return decrypted_data
async def get_shoujihao(self):
if len(self.shoujihao) >= 20:
shoujihao1 = self.shoujihao
shoujihao1 = base64.b64decode(shoujihao1)
# Split the data into chunks for parallel decryption
chunk_size = 8000 # Adjust the chunk size based on your data
chunks = [shoujihao1[i:i + chunk_size] for i in range(0, len(shoujihao1), chunk_size)]
# Use asyncio.gather to concurrently decrypt chunks
decrypted_chunks = await asyncio.gather(*(self.decrypt_data_async(chunk) for chunk in chunks))
# Concatenate the decrypted chunks
decrypted_data = ''.join(decrypted_chunks)
color_code = 'green'
return format_html('<span style="color:{};">{}</span>', color_code, decrypted_data)
else:
color_code = 'green'
return format_html('<span style="color:{};">-</span>', color_code, )
get_shoujihao.short_description = '手机号'
# -------------------------------------------------------------------------------------
2:使用多线程进行手机号进行解密,消耗时间3秒
python
# --------------------------------------------------------------------------------------
# 使用多线程进行解密
from concurrent.futures import ThreadPoolExecutor
# --------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------
# 手机号解密
# 使用了多线程方式去进行解密
def get_shoujihao(self):
# 1:获取到数据库中的字符串 a
# 2:把字符串转换成字节类型 b
# 3:对字节b进行解密为 c
# 4:返回c
if len(self.shoujihao)>=20:
shoujihao1=self.shoujihao
shoujihao1 = base64.b64decode(shoujihao1)
# 读取私钥文件
private_key="""-----BEGIN RSA PRIVATE KEY-----
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""
key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())
def decrypt_data(data):
return key.decrypt(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)).decode('utf-8')
# 将数据拆分为块以进行并行解密
chunk_size = 1000 # 根据数据调整区块大小
chunks = [shoujihao1[i:i + chunk_size] for i in range(0, len(shoujihao1), chunk_size)]
# 使用 ThreadPoolExecutor 进行并行解密
with ThreadPoolExecutor() as executor:
decrypted_chunks = list(executor.map(decrypt_data, chunks))
# 连接解密的块
decrypted_data = ''.join(decrypted_chunks)
color_code = 'green'
return format_html('<span style="color:{};">{}</span>', color_code, decrypted_data)
else:
color_code = 'green'
return format_html('<span style="color:{};">-</span>', color_code, )
get_shoujihao.short_description = '手机号'
# -------------------------------------------------------------------------------------
3使用多进程来进行手机号解密--直接报错,额,我技术差
python
# --------------------------------------------------------------------------------------
# 使用多进程进行解密
import logging
from concurrent.futures import ProcessPoolExecutor
logger = logging.getLogger(__name__)
# --------------------------------------------------------------------------------------
# -------------------------------------------------------------------------------------
# 手机号解密
# 使用了多进程方式去进行解密
def decrypt_data(self, data):
try:
# 读取私钥文件
private_key="""-----BEGIN RSA PRIVATE KEY-----
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""
key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())
return key.decrypt(data, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)).decode('utf-8')
except Exception as e:
logger.error(f"Error in decryption: {e}")
raise
def get_shoujihao(self):
if len(self.shoujihao) >= 20:
shoujihao1 = self.shoujihao
shoujihao1 = base64.b64decode(shoujihao1)
# 将数据拆分为块以进行并行解密
chunk_size = 1000 # 根据数据调整区块大小
chunks = [shoujihao1[i:i + chunk_size] for i in range(0, len(shoujihao1), chunk_size)]
# 使用 ProcessPoolExecutor 进行并行解密
with ProcessPoolExecutor(max_workers=2) as executor:
decrypted_chunks = list(executor.map(self.decrypt_data, chunks))
# 连接解密的块
decrypted_data = ''.join(decrypted_chunks)
color_code = 'green'
return format_html('<span style="color:{};">{}</span>', color_code, decrypted_data)
else:
color_code = 'green'
return format_html('<span style="color:{};">-</span>', color_code, )
get_shoujihao.short_description = '手机号'
# -------------------------------------------------------------------------------------
4:普通调用对手机号进行解密:消耗3秒
python
# -------------------------------------------------------------------------------------
# 手机号解密
def get_shoujihao(self):
# 1:获取到数据库中的字符串 a
# 2:把字符串转换成字节类型 b
# 3:对字节b进行解密为 c
# 4:返回c
if len(self.shoujihao)>=20:
shoujihao1=self.shoujihao
shoujihao1 = base64.b64decode(shoujihao1)
# 读取私钥文件
private_key="""-----BEGIN RSA PRIVATE KEY-----
ekDfPc/BqzRSIkACEijwdnf7NhQveCAiE+aj5NiGkwS/zjX9S96v0qK5SFil6y+c
EXv1GMN54aCmiHWBGq86tOKjV9M4hnlVpuRJPeHi52nAyHpJfmB7
-----END RSA PRIVATE KEY-----"""
key = serialization.load_pem_private_key(private_key.encode(), password=None, backend=default_backend())
decrypted_data = key.decrypt(shoujihao1, padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None))
# decrypted_data 的类型为字节
decrypted_data=decrypted_data.decode('utf-8')
# decrypted_data.decode()之后的类型为字符串
shoujihao1=decrypted_data
# print("类型")
# print(type(decrypted_data))
# print(decrypted_data)
# 打印解密后的消息
color_code = 'green'
return format_html('<span style="color:{};">{}</span>', color_code, shoujihao1)
else:
color_code = 'green'
return format_html('<span style="color:{};">-</span>', color_code, )
get_shoujihao.short_description = '手机号'
# -------------------------------------------------------------------------------------