热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python多进程程序退出异常解决方案

本文探讨了在使用Python进行多进程编程时遇到的退出异常问题,并提供了一种有效的解决方案。尤其针对大量数据和高并发场景下的异常退出情况进行了优化。

在Python中实现多进程编程时,尤其是在处理大规模数据集或高并发请求时,可能会遇到程序执行完成后无法正常退出的问题。这种退出异常通常发生在进程数量较多且任务复杂度较高的情况下。本文将介绍一种有效的方法来解决此类问题,并通过一个具体的示例来说明如何实现。



import argparse
import requests
from multiprocessing import Pool
import datetime
time
from requests.packages.urllib3.exceptions import InsecureRequestWarning

# 禁用安全请求警告
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def parse_arguments():
"""解析命令行参数"""
parser = argparse.ArgumentParser(description='批量处理URL请求脚本')
parser.add_argument('-f', dest='input_file', type=str, required=True, help='输入URL列表文件')
parser.add_argument('-o', dest='output_file', type=str, default='results.txt', help='输出结果文件')
parser.add_argument('-p', dest='proxy_server', type=str, default='', help='代理服务器地址')
parser.add_argument('-n', dest='num_processes', type=int, default=1, help='进程数量')
args = parser.parse_args()
return args.input_file, args.output_file, args.proxy_server, args.num_processes

def configure_proxy(proxy_server):
"""配置代理服务器"""
if not proxy_server:
return {}
username = input('请输入用户名: ')
password = getpass.getpass('请输入密码: ')
http_proxy = f'http://{username}:{password}@{proxy_server}'
https_proxy = f'https://{username}:{password}@{proxy_server}'
return {
'http': http_proxy,
'https': https_proxy
}

def read_urls(file_path):
"""从文件读取URL列表"""
with open(file_path, 'r') as file:
urls = file.readlines()
return [url.strip() for url in urls]

def send_request(url, proxies=''):
"""发送HTTP请求并返回状态码"""
headers = {'User-Agent': 'curl/3.03', 'Connection': 'close'}
try:
respOnse= requests.get(url, headers=headers, proxies=proxies, timeout=15, verify=False)
return f'{url} {response.status_code}'
except Exception as e:
return f'{url} {e}'

def main():
start_time = datetime.datetime.now()
input_file, output_file, proxy_server, num_processes = parse_arguments()
urls = read_urls(input_file)
proxies = configure_proxy(proxy_server)
pool = Pool(num_processes)
print(f'总URL数量: {len(urls)}')

def log_result(result):
with open(output_file, 'a+') as file:
file.write(result + '\n')

results = [pool.apply_async(send_request, args=(url, proxies), callback=log_result) for url in urls]
pool.close()
completed_count = 0
while True:
try:
time.sleep(60)
for result in results:
if result.ready():
completed_count += 1
result.get()
if completed_count > len(results) * 0.95:
break
except Exception as e:
print(f'进程异常: {e}')
pool.terminate()
pool.join()
end_time = datetime.datetime.now()
print(f'开始时间: {start_time}')
print(f'结束时间: {end_time}')
print(f'总耗时: {end_time - start_time}')
print(f'结果保存在: {output_file}')

if __name__ == '__main__':
main()


推荐阅读
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文探讨了使用C#在SQL Server和Access数据库中批量插入多条数据的性能差异。通过具体代码示例,详细分析了两种数据库的执行效率,并提供了优化建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • ElasticSearch 集群监控与优化
    本文详细介绍了如何有效地监控 ElasticSearch 集群,涵盖了关键性能指标、集群健康状况、统计信息以及内存和垃圾回收的监控方法。 ... [详细]
  • ML学习笔记20210824分类算法模型选择与调优
    3.模型选择和调优3.1交叉验证定义目的为了让模型得精度更加可信3.2超参数搜索GridSearch对K值进行选择。k[1,2,3,4,5,6]循环遍历搜索。API参数1& ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • andr ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文介绍了如何利用npm脚本和concurrently工具,实现本地开发环境中多个监听服务的同时启动,包括HTTP服务、自动刷新、Sass和ES6支持。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
author-avatar
Chinaexpoinfo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有