热门标签 | 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()


推荐阅读
  • python爬虫Demo
    1爬虫功能:爬取某域名下所有网页,比如爬取python文档 https:docs.python.orgzh-cn3 ,爬取之后, ... [详细]
  • 本文介绍了如何在Ubuntu 16.04系统上配置Nginx服务器,以便能够通过网络访问存储在服务器上的图片资源。这解决了在网页开发中需要使用自定义在线图标的需求。 ... [详细]
  • 本文探讨了在使用basicHttpBinding通过HTTPS发送请求时遇到的握手失败问题,分析了可能的原因及解决方案。 ... [详细]
  • 请看|差别_Android 6.0 运行时权限处理解析
    请看|差别_Android 6.0 运行时权限处理解析 ... [详细]
  • 本文探讨了在支付项目开发中使用SS5 Socket Server实现内部网络访问外部网络的技术方案。详细介绍了SS5的安装、配置及性能测试过程,旨在为面临相同需求的技术人员提供参考。 ... [详细]
  • 本文详细介绍了黑马旅游网的用户退出功能实现方法,包括前后端代码的具体操作步骤。通过访问Servlet销毁session,并重定向至登录页面。 ... [详细]
  • C# 对象转 JSON 字符串的方法与应用
    本文介绍如何在 C# 中使用一般处理程序(ASHX)将对象转换为 JSON 字符串,并通过设置响应类型为 application/json 来确保客户端能够正确解析返回的数据。同时,文章还提供了 HTML 页面中不依赖 jQuery 的 AJAX 方法来接收和处理这些 JSON 数据的具体实现。 ... [详细]
  • 针对上一期关于 Windows 8 的问题,我们正在积极解决。本文提供 IE6,7,8 三个版本的单文件版下载,适用于 Windows Vista/7 系统,支持 x86 和 x64 架构。欢迎大家下载并分享。 ... [详细]
  • Struts2(六) 用Struts完成客户列表显示
    Struts完成客户列表显示所用的基础知识在之前的随笔中已经讲过。这篇是介绍如何使用Struts完成客户列表显示。下面是完成的代码执行逻辑图:抽取项目部分代码相信大家 ... [详细]
  • 博主从零开始学习HTML(入门基础)
    从零开始学习HTML(入门基础)互联网三大基石HTTP协议URL:统一资源定位符HTML:超文本标记语言HTML的Head标签中的常用元素<!--告知 ... [详细]
  • 应用场景在开发中,我们经常需要把一些随时可能变化的属性配置到配置文件中,这样耦合性低,方便维护。SpringBoot在这方面为我们提供了很大的便捷,我们可以很轻易的将propert ... [详细]
  • Working with Errors in Go 1.13
    作者|陌无崖 ... [详细]
  • 构建Struts 2 Web应用程序指南
    本文提供了一个详细的步骤指南,帮助开发者从零开始创建一个简单的Struts 2 Web应用程序,涵盖了从环境搭建到项目部署的全过程。 ... [详细]
  • 本教程将指导您完成 Spring Boot 应用程序中 MySQL 数据库的配置,并通过 JdbcTemplate 进行基本的数据操作测试。在此之前,我们已经成功打包并测试了 jar 和 war 包,同时实现了 JSP 页面的访问,但页面数据是静态配置的。现在,让我们一起进入数据库配置的世界。 ... [详细]
  • 文章目录17、less17-UpdateQuery-Errorbased-String18、less18-HeaderInjection-ErrorBased-string19、l ... [详细]
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社区 版权所有