Python 脚本死锁问题与解决方案

简介: 该 Python 脚本旨在启动多个线程,每个线程又通过 Popen 启动一个子进程。子进程将从一个数据库中的表格中将 10M 条记录传输到另一个数据库中的不同表格中。这个过程中会涉及大量的数据整理和转换,因为两个数据库具有不同的架构。子进程在执行过程中,如果遇到错误(如错误的记录或重复的主键)或执行成功,都会输出 “Done\n”;如果没有更多记录可供传输,则会输出 “NO DATA\n”。

1. 问题背景

该 Python 脚本旨在启动多个线程,每个线程又通过 Popen 启动一个子进程。子进程将从一个数据库中的表格中将 10M 条记录传输到另一个数据库中的不同表格中。这个过程中会涉及大量的数据整理和转换,因为两个数据库具有不同的架构。子进程在执行过程中,如果遇到错误(如错误的记录或重复的主键)或执行成功,都会输出 “Done\n”;如果没有更多记录可供传输,则会输出 “NO DATA\n”。

脚本 “tableTransfer.py” 意在生成这些子进程,读取它们的输出,并依此输出一些信息,如已完成的更新数量、剩余时间、已经过去的时间,以及每秒的传输数量。

然而,在运行这个脚本一段时间后,遇到了死锁问题。子进程没有在运行,还有记录需要更新,脚本也没有退出。它只是停在那里,不再输出当前信息,因为没有子进程运行来更新总完成数(这是控制输出更新的内容)。

2. 解决方案

2.1 使用队列通信

为了解决死锁问题,需要使用队列来进行进程间通信。队列是一个先进先出的数据结构,可以将数据从一个进程传输到另一个进程。在脚本中,可以创建一个队列来存储子进程的输出,然后由主进程从队列中读取输出并进行处理。这样,子进程就不会阻塞主进程,也不会发生死锁。

2.2 使用信号处理

为了处理 Ctrl+C 中断信号,需要使用信号处理模块。该模块提供了处理不同信号的函数,包括 Ctrl+C 中断信号。在脚本中,可以使用信号处理模块注册一个 Ctrl+C 中断信号处理函数,当用户按下 Ctrl+C 时,该函数将被调用。在处理函数中,可以关闭所有子进程并退出脚本。

2.3 优化脚本结构

为了提高脚本的可读性和可维护性,可以对脚本的结构进行优化。例如,可以将脚本划分为不同的函数,每个函数负责一个特定的任务。还可以使用面向对象编程来组织代码,使代码更加模块化和易于复用。

2.4 代码示例

import queue
import threading
import signal
import subprocess
# 创建一个队列来存储子进程的输出
output_queue = queue.Queue()
# 创建一个函数来处理子进程的输出
def process_output(output):
    # 在这里处理子进程的输出
    # ...
# 创建一个函数来启动一个子进程
def start_subprocess(command):
    # 启动一个子进程
    process = subprocess.Popen(command, stdout=subprocess.PIPE)
    # 将子进程的输出添加到队列中
    for line in iter(process.stdout.readline, b''):
        output_queue.put(line.decode('utf-8'))
    # 等待子进程完成
    process.wait()
# 创建一个函数来处理 Ctrl+C 中断信号
def signal_handler(signal, frame):
    # 关闭所有子进程
    for thread in threads:
        thread.join()
    # 退出脚本
    exit()
# 注册 Ctrl+C 中断信号处理函数
signal.signal(signal.SIGINT, signal_handler)
# 创建一个列表来存储线程
threads = []
# 启动一定数量的线程来启动子进程
for i in range(10):
    thread = threading.Thread(target=start_subprocess, args=('python script.py',))
    threads.append(thread)
    thread.start()
# 从队列中读取输出并进行处理
while True:
    output = output_queue.get()
    process_output(output)


相关文章
|
7天前
|
SQL 分布式计算 大数据
MaxCompute产品使用问题之建了一个python 的 UDF脚本,生成函数引用总是说类不存在,是什么导致的
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
11天前
|
Python Windows
在 Windows 平台下打包 Python 多进程代码为 exe 文件的问题及解决方案
在使用 Python 进行多进程编程时,在 Windows 平台下可能会出现将代码打包为 exe 文件后无法正常运行的问题。这个问题主要是由于在 Windows 下创建新的进程需要复制父进程的内存空间,而 Python 多进程机制需要先完成父进程的初始化阶段后才能启动子进程,所以在这个过程中可能会出现错误。此外,由于没有显式导入 Python 解释器,也会导致 Python 解释器无法正常工作。为了解决这个问题,我们可以使用函数。
18 5
|
14天前
|
运维 监控 API
自动化运维实践指南:Python脚本优化服务器管理任务
本文探讨了Python在自动化运维中的应用,介绍了使用Python脚本优化服务器管理的四个关键步骤:1) 安装必备库如paramiko、psutil和requests;2) 使用paramiko进行远程命令执行;3) 利用psutil监控系统资源;4) 结合requests自动化软件部署。这些示例展示了Python如何提升运维效率和系统稳定性。
30 8
|
17天前
|
存储 区块链 Python
怎么把Python脚本打包成可执行程序?
【6月更文挑战第3天】最近根据用户提的需求用python做了一个小工具,但是在给客户使用的时候不能直接发送python文件,毕竟让客户去安装python环境,那就离了大谱了。所以这时候就需要把多个py文件带着运行环境打包成EXE可执行文件。
15 1
|
3天前
|
Shell Python
技术经验解读:使用python脚本传递参数:(三种方式可收藏)
技术经验解读:使用python脚本传递参数:(三种方式可收藏)
|
4天前
|
数据安全/隐私保护 Python
程序技术好文:猪圈密码python脚本实现
程序技术好文:猪圈密码python脚本实现
10 0
|
4天前
|
Python
python 代码脚本汇编
python 代码脚本汇编
15 0
|
4天前
|
机器学习/深度学习 移动开发 JavaScript
Python 实用脚本分享
Python 实用脚本分享
18 0
|
16天前
|
Go Python
go语言调用python脚本
go语言调用python脚本
18 0
|
29天前
|
存储 区块链 Python
怎么把Python脚本打包成可执行程序?
最近根据用户提的需求用python做了一个小工具,但是在给客户使用的时候不能直接发送python文件,毕竟让客户去安装python环境,那就离了大谱了。所以这时候就需要把多个py文件带着运行环境打包成EXE可执行文件。
怎么把Python脚本打包成可执行程序?