【Python】给程序的循环加一个运行定时,让它运行一个小时就停止程序

我需要一些一个会自动停下来的程序,因为有时候一直爬取某个网站,会引起对方网站的反爬,所以有时候需要停下来,休息一段时间。

先写一个简单的写法,我让程序每隔半秒钟,就print一个数字出来,然后大概超过5秒钟,for循环就结束。

start_time=datetime.datetime.now()
print(start_time)

for i in range(1000): 
    nowtime=datetime.datetime.now()
    
    if  (nowtime - start_time).total_seconds() > 5: #一旦超过5秒,就停下来
       break
    else:
       print(i)
       sleep(0.5)

最后的结果确实是到了第10个数字之后就停下来了。

如果我们想要将定时变成【分钟】或者【时钟】,那么可以用替换成:

(nowtime - start_time).total_seconds() / 60

替换过后,上面的判断相当于是每隔多少分钟就停下来的。

这里的.total_seconds() 将时间差转为秒,方便计算分钟或小时。

这个方法适适合爬取的时候,需要控制爬取时长。

<think>好的,我现在需要帮助用户找到一个使用Python编写定时发送串口数据的简单程序示例。用户提到了定时器和串口数据发送,所以我得结合这两个方面来给出解决方案。 首先,我需要回忆一下Python中处理串口通信的库。记得常用的有pySerial,这个库提供了跨平台的串口操作功能。用户之前的引用中也提到了pySerial的使用,比如设置端口、波特率等参数,所以应该用这个库来实现。 接下来是定时发送数据的问题。Python中实现定时任务的方法有多种,比如使用time.sleep()在循环中等待,或者使用更高级的sched模块,甚至是多线程。但考虑到用户需要一个简单的示例,可能使用循环sleep的方法更直接,不过这样可能会阻塞主线程。另一个方法是使用threading.Timer来周期性地触发发送函数,这样可以在单独的线程中运行,避免阻塞。 用户提供的引用中有关于定时发送的代码片段,比如引用4中的loop_send函数使用了QTimer,但那是基于PyQt的,可能用户想要一个不依赖GUI框架的简单示例。所以应该选择基础的方法,比如使用threading模块中的Timer类来实现定时任务。 接下来需要整合这两个部分。首先导入必要的库:serial和threading。然后配置串口参数,比如端口号、波特率等。然后定义发送数据的函数,并在其中设置定时器,以便重复调用自身,从而实现定时发送。 还需要处理可能的异常,比如串口无法打开的情况,或者在发送数据时出现的错误。比如在try-except块中捕获异常,并打印错误信息。 另外,用户可能需要数据发送的格式,比如发送字符串还是字节。根据pySerial的文档,write方法需要字节数据,所以要用encode()方法将字符串转换为字节,或者直接发送字节数组。 在示例代码中,发送内容可以是用户自定义的,比如发送"Hello",每隔1秒发送一次。同时,用户可能需要停止发送的机制,比如设置一个停止标志,通过键盘输入来触发停止循环。 不过,为了保持示例简单,可能不需要入复杂的停止逻辑,而是让用户手动终止程序。或者添一个循环次数限制,比如发送10次后停止。 综合这些考虑,最终的代码结构大致如下: 1. 导入必要的库。 2. 配置串口参数并打开串口。 3. 定义发送函数,该函数调用自身定时执行。 4. 启动定时器。 5. 处理异常和关闭串口。 同时,需要确保代码的健壮性,比如检查串口是否成功打开,处理定时器可能带来的线程问题,以及正确的资源释放(关闭串口)。 现在检查是否有遗漏的部分。比如,用户是否需要数据发送的确认或回显?示例可能不需要,但可以添打印语句来显示发送状态。 可能还需要考虑不同的数据发送方式,比如发送十六进制数据,这时需要将数据转换为字节。例如,如果用户想发送0x01这样的数据,可以使用bytes或bytearray。 但根据用户提供的引用,比如引用2中的单片机代码发送的是数据1,可能用户需要发送的是字节数据,比如b&#39;\x01&#39;。不过示例中发送的是字符串,所以需要明确说明如何转换。 在示例中,可以保持简单,使用字符串的encode()方法,同时注释说明如何发送十六进制数据。 最后,测试代码是否覆盖了用户的需求:定时发送数据,使用Python,基于pySerial和threading.Timer。确保代码结构清晰,注释详细,方便用户理解和修改。</think>以下是一个基于Python定时发送串口数据示例程序,结合pyserial库和定时器功能实现: ```python import serial import threading import time # 配置串口参数 PORT = &#39;COM5&#39; # 串口号(根据实际情况修改) BAUDRATE = 9600 # 波特率 INTERVAL = 1 # 发送间隔(秒) # 创建串口对象 try: ser = serial.Serial( port=PORT, baudrate=BAUDRATE, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1 ) print(f"成功打开串口 {PORT}") except Exception as e: print(f"打开串口失败: {str(e)}") exit() # 定时发送函数 def timed_send(): try: if ser.is_open: # 发送数据(示例发送"Hello") data = "Hello".encode(&#39;utf-8&#39;) # 字符串转字节 ser.write(data) print(f"已发送数据: {data} - {time.strftime(&#39;%H:%M:%S&#39;)}") # 设置下一次定时发送 threading.Timer(INTERVAL, timed_send).start() except Exception as e: print(f"发送数据时出错: {str(e)}") ser.close() if ser.is_open: try: # 启动首次发送 timed_send() print("定时发送已启动,按Ctrl+C停止...") # 保持主线程运行 while True: time.sleep(1) except KeyboardInterrupt: print("\n程序已终止") ser.close() ``` ### 关键功能说明 1. **串口配置**:通过`serial.Serial()`配置串口参数,支持自定义端口号、波特率等设置[^1] 2. **定时机制**:使用`threading.Timer`实现非阻塞定时发送,间隔时间可调 3. **数据转换**:`.encode(&#39;utf-8&#39;)`将字符串转为字节格式,符合串口通信规范[^3] 4. **异常处理**:包含串口打开失败、发送失败等异常处理 5. **发送内容修改**:修改`data`变量即可发送不同内容,支持发送十六进制数据(示例:`data = b&#39;\x01&#39;`) ### 扩展应用 - 需要发送十六进制数据时,可使用字节字面量:`data = b&#39;\x01\x02&#39;` - 如需循环发送不同数据,可在`timed_send()`函数中添数据生成逻辑 - 结合GUI界面时,可参考`pyqtgraph`的定时器实现更友好的交互界面[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值