chatGPT给出Python time.sleep()假死(挂起)的解决办法

news2024/12/28 11:47:44

1. time.sleep()假死(挂起)的原因与解决办法

最近,使用chatGPT帮着写程序,完成通过API获取天气数据的程序,运行起来后出现了状况:莫名其妙的的假死(程序被挂起来,不执行了),而且在Linux环境中更容易挂起。

程序详见作者的博文” 使用chatGPT开发获取格点天气数据“。

起初,我的目的是开发个近期使用,临时获取气象数据的程序,而业务应用有专业人员在其应用中实现,未考虑线程开发内容,在chatGPT提醒下,有针对性写出线程服务程序。

注:都是chatGPT的方案,这次,增加了线程内容。

主要原因:

尽量避免在主线程中使用 sleep() 函数,因为这样会导致程序阻塞,无法被唤醒。如果必须在主线程中使用 sleep() 函数,可以考虑将任务提交到一个独立的线程中。
在这里插入图片描述
解决办法:

采用线程编程方法。

通过与chatGPT交流,最后,在我强力要求下,完成了”start_thread():“函数,主要代码如下:

import requests
import csv
import time
import datetime
import threading

# API接口
url = "https://devapi.qweather.com/v7/grid-weather/now"

# 请求参数,location为经纬度坐标,key为API密钥
params = {
    "location": "103.59984,36.18057",
    "key": "****************"
}

fieldnames = [ 'getTime', 'obsTime', 'temp', 'icon', 'text', 'wind360', 'windDir', 'windScale',
              'windSpeed', 'humidity', 'precip', 'pressure', 'cloud', 'dew' ,'status']
# csv文件名
filename = 'qweather_data.csv'
logname = 'log2.txt'
time_status = ["00", "30"]

# 获取天气数据
def get_weather_data():
	while True:
		try:        
			# 获取当前时间
			current_time = time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime())

			# 判断是否为整点或半点
			if current_time.split(":")[1] in time_status:     
				# 发送API请求并获取返回结果
				response = requests.get(url, params=params)
				result = response.json()

				# 提取关键数据并写入csv文件
				now_data = result['now']
				......				
			
			# 等待到整点或半点
			now = time.localtime()
			if now.tm_min < 30:
				wait_time = (30 - now.tm_min) * 60 - now.tm_sec
			else:
				wait_time = (60 - now.tm_min) * 60 - now.tm_sec
			
			print(f"{current_time}: Server is Runing, Wait_time: {wait_time}s\n")
			time.sleep(wait_time)
	   
		except requests.exceptions.ConnectionError as e:
			print(f"{current_time}: {e}. Retrying in 5 seconds...")

			....
			now = time.localtime()
			if now.tm_min < 5:
				wait_time = (5 - now.tm_min) * 60 - now.tm_sec
			else:
				wait_time = (35 - now.tm_min) * 60 - now.tm_sec

			time.sleep(wait_time)
			# time.sleep(30)
		except Exception as e:
			print(f"{current_time}: {e}.")
			break    

def start_thread():
    t = threading.Thread(target=get_weather_data)
    print('start server ... ')
    t.start()
    t.join()
    
start_thread()

在start_thread()函数中,我们创建了一个新的线程t,并将其启动。t的目标函数为get_weather_data(),也就是获取天气数据的函数。然后,我们调用了t.join(),等待线程t结束。因为我们的线程t永不结束,所以这里实际上不会有任何作用。

这个程序会在每个整点和半点获取一次天气数据,并打印获取成功的消息。在获取数据时发生异常,会打印异常信息。注意,为了避免在不必要的时间内占用CPU资源,我们使用time.sleep()函数在整点和半点之间等待一定时间。

2. 小结

  • 使用time.sleep(),最好使用线程方法;
  • 合理的引导chatGPT交流,能快速帮助我们解决问题。

3. chatGPT交流节选

chatGPT分析源代码

明白了,那么这个问题可能和Linux环境的一些特殊性有关,比如Linux中对于进程的限制等。你可以尝试以下方法来解决这个问题:

  1. 检查你的代码是否有死循环或死锁等问题,如果有可能会导致程序无法正常退出。
  2. 使用nohup命令在后台运行程序,并且输出日志到文件中,这样即使你关闭终端也可以让程序一直运行下去。例如:nohup python3 your_program.py > log.txt &
  3. 检查Linux环境中对于进程的限制,例如是否有进程数、文件打开数等的限制,如果有可以适当修改这些限制。你可以通过ulimit -a命令来查看当前系统的限制情况。
  4. 使用一些系统级别的进程管理工具来监控你的程序,例如systemdsupervisor等,这些工具可以帮助你监控程序的状态并在程序异常退出时自动重启程序。

解释sleep原理:

在Python中,sleep函数是用来阻塞程序一段时间的方法。当程序调用sleep函数时,它会挂起当前线程,让CPU去执行其他线程或进程,等待指定的时间后,再唤醒当前线程继续执行。

sleep函数的阻塞是一种比较暴力的方式,它会占用当前线程的CPU时间片,使得其他线程无法获得CPU时间片执行任务。因此,如果在主线程中使用sleep函数,可能会导致整个程序的性能下降。

为了避免sleep函数阻塞主线程,我们可以使用线程来解决。在使用线程的情况下,可以在子线程中执行耗时的操作,而不会影响主线程的运行。在子线程中,可以使用sleep函数来等待一定的时间,而不会影响其他线程的运行。

下面是一个使用线程来解决sleep阻塞的例子:

import threading
import time

def worker():
    while True:
        print("Worker is running...")
        time.sleep(1)

if __name__ == '__main__':
    t = threading.Thread(target=worker)
    t.start()
    while True:
        print("Main thread is running...")
        time.sleep(1)

在这个例子中,我们创建了一个worker线程,它会一直运行并且每隔一秒钟输出一次。同时,主线程也会一直运行并且每隔一秒钟输出一次。在主线程中,我们使用sleep函数来阻塞一秒钟,而不是在worker线程中使用sleep函数。

这样做的好处是,worker线程可以在阻塞的同时,让CPU去执行主线程,避免了sleep函数阻塞主线程的问题。而且,使用线程还可以让程序具有更好的可扩展性,可以方便地增加或删除子线程。

需要注意的是,如果线程中存在共享资源,需要使用锁或者其他同步机制来保证线程安全。另外,如果线程中存在长时间的阻塞操作,例如网络I/O或者磁盘I/O,建议使用异步编程来避免阻塞。

在Linux环境中,主线程中使用sleep函数,是很容易造成程序挂起后,无法唤醒,有办法唤醒吗,请详细讲解。

在 Linux 环境中,使用 sleep 函数会将当前进程阻塞,让 CPU 休眠指定的时间,等待时间结束后再继续执行。如果在阻塞期间出现了某种信号(比如 SIGINT 或 SIGTERM),就可能无法在预期时间内唤醒程序。这是因为阻塞期间,进程无法处理信号。

为了解决这个问题,我们可以使用信号处理函数和 sigwait 函数来实现。 sigwait 函数允许我们在程序中等待一个或多个特定信号,并阻塞程序的执行,直到收到信号。

下面是一个示例代码,展示如何使用 sigwait 函数代替 sleep 函数:

import signal
import threading

def signal_handler(signum, frame):
    """信号处理函数"""
    print('Received signal %d' % signum)

def wait_for_signal(signum):
    """等待信号的线程函数"""
    signal.sigwait([signum])

# 注册信号处理函数
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)

# 创建等待信号的线程
signal_thread = threading.Thread(target=wait_for_signal, args=(signal.SIGINT,))
signal_thread.start()

# 主线程继续执行其他操作
while True:
    print('Doing something...')

在这个示例中,我们创建了一个等待信号的线程,使用 sigwait 函数阻塞线程的执行,等待 SIGINT 信号。当收到 SIGINT 信号时,信号处理函数会被调用,打印出一条消息。在主线程中,我们使用一个简单的循环打印一条消息,来模拟程序的其他操作。这样,我们就可以在主线程中继续执行其他操作,而不必使用阻塞的 sleep 函数。

需要注意的是,如果使用 sigwait 函数等待多个信号,那么当其中任意一个信号被触发时,阻塞才会被解除。因此,如果你需要等待多个信号,需要将信号处理函数分别注册到每个信号上,并在处理函数中设置标志来记录收到的信号。

参考:

louis. 进程池 阻塞式进程 和非阻塞式进程. 知乎 . 2022.05
肖永威. 使用chatGPT开发获取格点天气数据. CSDN博客. 2023.04

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/496037.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目结构如何改造(利用RuoYi-Vue脚手架开发一个健身房会员管理系统,改造项目结构)

项目结构如何改造&#xff08;利用RuoYi-Vue脚手架开发一个健身房会员管理系统&#xff0c;改造项目结构&#xff09; 1. 全局查找替换&#xff08;Ctrl Shift R&#xff09;2. 全局查找替换版本号3. 全局查找替换模块名4. 修改项目名5. ShiftF6 重命名模块6. ShiftF6 重命名…

Nginx配置使用GeoIP2模块

一、Nginx简介 Nginx(engine x)是一个免费的、开源的、高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个…

不废话!CentOS 8 安装docker的详细过程

目录 1.更新系统 2. 安装依赖包 3.添加 Docker YUM 仓库 4.安装 Docker 5.启动 Docker 6.设置 Docker 开机自启 7.测试 Docker 1.更新系统 dnf update 这里直接输入y&#xff0c;耐心等待更新即可 直到看到complete表示更新完毕 2. 安装依赖包 Docker 需要一些依赖包才能正常…

什么是工业互联网?5G到底能在工业互联网中承担哪些重任呢?

一. 从消费互联网到工业互联网 在这个互联网如我们生活中的水和电一样无孔不入的时代&#xff0c;不能联网的设备是可耻的。它们像是一个一个的信息孤岛&#xff0c;原始而静寂。 然而50年前&#xff0c;这样的信息孤岛却是这个世界的常态&#xff0c;直到美国阿帕网的诞生…

运营-7.内容模型

在内容产品生态中&#xff0c;核心就是内容&#xff0c;内容驱使着所有的角色运转。具体而言&#xff0c;在整个生态模型中&#xff0c;内容的链条从上游 到下游的环节如下&#xff1a; PGC&#xff08;Professionally-generated Content&#xff09;专业生产内容 传统的门户…

最强无监督单目深度估计Baseline--MonoViT--简介与代码复现

1. 无监督单目深度估计 单目深度估计是指&#xff0c;借助于深度神经网络&#xff0c;从单张输入视图中推理场景的稠密深度信息&#xff1b;该技术可以广泛用于自动驾驶、虚拟现实、增强现实等依赖于三维场景感知理解的领域&#xff0c;同时也可以为其他视觉任务提供多模态深度…

部署simple-chat项目

simple-chat介绍&#xff1a;此项目是基于openAI3.5模型的h5端人工智能聊天项目&#xff0c;无需翻墙即可体验。 simple-chat线上地址&#xff1a;simple-chat simple-chat项目地址&#xff1a;GitHub - AMxiaoming/simple-chat nginx部署前端步骤&#xff1a; https://blo…

Android WebRtc+SRS/ZLM视频通话(1):虚拟机安装Ubuntu

Android WebRtcSRS/ZLM视频通话&#xff08;1&#xff09;&#xff1a;虚拟机安装Ubuntu 来自奔三人员的焦虑日志 秉着没事找事的原则&#xff0c;这里直接从服务器安装开始说起&#xff0c;也当记录自己这一路以来的愚昧之举&#xff0c;由于没有物理服务器&#xff0c;这里以…

使用七牛云进行上传图片

首先我们需要明确上传图片的注意点是什么&#xff1f; 1、表单组件标签只能用<input type"file"> 2、上传图片必须采用post请求 get:参数通过请求头提交到后台&#xff0c;参数放到url后面来提交的只能向后台提交文本数据或者字符串数据&#xff0c;二进制如以…

基于物联网可移动医疗设备智能监测节能应用研讨

智慧医疗、全民健康一直是社会关注的热点之一。医疗卫生体系的发展水平关系到人民群众的身心健康和社会和谐&#xff0c;智慧医疗旨在通过物联网技术实现准确、实时感知医疗信息&#xff0c;并进行全面、科学分析&#xff0c;作出智慧的决策&#xff0c;从而提升医疗服务的信息…

黄金投资品种有哪些,如何选择黄金品种

黄金是国际性的硬通货&#xff0c;具有世界货币的地位和国际都认可的流通性&#xff0c;在金融投资市场中黄金也一直属于热门产品&#xff0c;是全球都认可的避险保值投资产品&#xff0c;人们不管是想保值还是向投资增值都是不错的选择&#xff0c;但黄金投资市场中产品种类多…

前端基于uniapp[uniPush]实现APP消息推送(安卓、IOS)

前提概述&#xff1a;此文章都是基于uniapp中uniPush2实现的在线、离线推送 app消息推送流程 登录开发者中心先填写好项目信息以及配置厂商在manifest.json文件中勾选推送模块在前端项目中创建云函数&#xff08;此云函数的作用是接受后台发送的消息模板&#xff0c;解析出来…

项目中常见的几种策略模式实现方式

前言 本篇文章主要介绍本人在自己项目中和开源项目中策略模式的实现方式 基于spring实现策略模式 最近在使用nacos-sync同步工具时发现其使用了策略模式&#xff0c;下面主要介绍它是如何使用的 实现步骤 2.1 定义接口&#xff1a;SyncService public interface SyncService …

交叉导轨具体应用在哪些领域?

交叉导轨通过采用缩短了滚柱体的间距的R型滚柱保持器这种独特的滚柱保持机制&#xff0c;使滚柱体的有效接触长度增大&#xff0c;且交叉导轨的安装高度更低&#xff0c;由于是两付导轨平行安装组合成为一套&#xff0c;使得交叉导轨的机台整体性要好于直线导轨&#xff0c;倾覆…

5 分钟教你如何免费用上 GPT-4

今天要分享的就是普通用户&#xff0c;没有 OpenAI 账号&#xff0c;不需要写代码&#xff0c;你依然可以免费体验 GPT-4&#xff0c;当然&#xff0c;会有一些缺点&#xff0c;本篇文章将会手把手教你怎么用上免费版的 GPT-4 以及它的一些限制。 第一步&#xff1a;打开 Stea…

嵌入式软考备考_5 嵌入式程序设计

嵌入式程序设计 开发流程 要想某个功能要用硬件还是软件实现&#xff08;硬件快&#xff0c;但是耗资源&#xff09;&#xff1f;BSP&#xff1f;裸机还是OS&#xff1f; 硬件的设计与实现-》设备驱动软件的设计与实现-》os的选择&#xff0c;移植&#xff0c;api接口函数的…

人工智能(Pytorch)搭建模型5-注意力机制模型的构建与GRU模型融合应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能(Pytorch)搭建模型5-注意力机制模型的构建与GRU模型融合应用。注意力机制是一种神经网络模型&#xff0c;在序列到序列的任务中&#xff0c;可以帮助解决输入序列较长时难以获取全局信息的问题。该模型通过…

工具收集 - 键鼠模拟改建

工具收集 - 键鼠模拟&改建 AutoTinyFreeMouseClickerX-Mouse Button Control AutoTiny 官网&#xff1a;https://autotiny.cn AutoTiny软件是一款PC电脑端使用的自动化录制制作软件&#xff0c;不仅能够实现电脑自动化操作&#xff0c;而且可以控制手机实现自动化操作。 A…

uniApp 实现上传功能(七牛云,node获取上传token)

版本&#xff1a;uniAppvue2uview-ui 需求&#xff1a;利用uView_upload组件实现上传功能 难点&#xff1a;兼容性强&#xff0c;支持pc、App、h5&#xff1b; 1.使用leancloud 实现上传(兼容性弱) JS-SDK 只兼容pc、h5&#xff0c;运行到虚拟机上会报错——uniApp问答详情&am…

深度挖掘.c到.exe的整个过程,透过现象看本质

文章目录 程序的翻译环境和执行环境翻译环境编译预编译头文件的包含删除注释替换#define定义的符号 编译词法分析语法分析语义分析符号汇总 汇编 链接合并段表符号表的合并和重定位 执行环境 程序的翻译环境和执行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境…