python 循环总是出现问题
本帖最后由 wangwei0511 于 2023-6-5 15:11 编辑写了两段代码,这两段代码(query和dy)都是不断的轮询 数据库(间隔10s、20s),如果数据库有新数据,就执行相应的操作。
我用一个主程序用两个线程,启动了这两段代码,但是总是运行差不多十多个小时就报错,
我的问题是,怎么才能正常的一直循环运行下去?
报错内容如下:
Fatal Python error: none_dealloc: deallocating None: bug likely caused by a refcount error in a C extension
Python runtime state: initialized
Thread 0x00002fa0 (most recent call first):
File "g:\\u5bfc\u6e38\u76f8\u5173\u7a0b\u5e8f\\u5bfc\u6e38\u540e\u53f0\u6267\u884c\u7a0b\u5e8f\def\u67e5\u8be2v2.py", line 31 in dy_thread
File "G:\python\Lib\threading.py", line 975 in run
File "G:\python\Lib\threading.py", line 1038 in _bootstrap_inner
File "G:\python\Lib\threading.py", line 995 in _bootstrap
Current thread 0x00002b0c (most recent call first):
File "g:\\u5bfc\u6e38\u76f8\u5173\u7a0b\u5e8f\\u5bfc\u6e38\u540e\u53f0\u6267\u884c\u7a0b\u5e8f\def\u67e5\u8be2v2.py", line 15 in query_thread.py", line 15 in query_thread
File "G:\python\Lib\threading.py", line 975 in run
File "G:\python\Lib\threading.py", line 1038 in _bootstrap_inner
File "G:\python\Lib\threading.py", line 995 in _bootstrap
Thread 0x00000acc (most recent call first):
File "G:\python\Lib\threading.py", line 1132 in _wait_for_tstate_lock
File "G:\python\Lib\threading.py", line 1112 in join .py", line 41 in restart_program
File "g:\\u5bfc\u6e38\u76f8\u5173\u7a0b\u5e8f\\u5bfc\u6e38\u540e\u53f0\u6267\u884c\u7a0b\u5e8f\def\u67e5\u8be2v2.py", line 49 in <module>.py", line 41 in restart_program
File "g:\\u5bfc\u6e38\u76f8\u5173\u7a0b\u5e8f\\u5bfc\u6e38\u540e\u53f0\u6267\u884c\u7a0b\u5e8f\def\u67e5\u8be2v2.py", line 49 in <module>
代码如下:
import threading
import time
import logging
from 导游查询v2 import query
from 导游录入智游宝 import dy
# 配置日志记录
logging.basicConfig(filename='log.txt', level=logging.INFO,
format='%(asctime)s %(levelname)s: %(message)s')
# 定义一个线程函数,用于执行 query() 函数
def query_thread():
while True:
try:
query()
except Exception as e:
logging.error(f"An error occurred: {e}")
# 发生异常时执行重启操作
restart_program()
time.sleep(10)
# 定义一个线程函数,用于执行 dy() 函数
def dy_thread():
while True:
try:
dy()
except Exception as e:
logging.error(f"An error occurred: {e}")
# 发生异常时执行重启操作
restart_program()
time.sleep(20)
# 创建两个线程并分别启动
t1 = threading.Thread(target=query_thread)
t2 = threading.Thread(target=dy_thread)
t1.start()
t2.start()
# 重启程序函数
def restart_program():
t1.join()# 等待线程 t1 结束
t2.join()# 等待线程 t2 结束
# 在这里执行重启操作,例如重新启动Python解释器或调用主程序的入口函数
# 主程序入口
if __name__ == "__main__":
while True:
time.sleep(60)# 每隔一段时间进行一次重启条件检查
restart_program()
在重启程序函数中,执行restart_program()的方式也存在问题。该函数在主程序的上下文中,直接调用restart_program()无法正常重启。可以将重启操作移到主程序的外部,然后通过os.execl(sys.executable, sys.executable, *sys.argv)重启,修改了代码,希望帮到你。
import threading
import time
import logging
import os
import sys
from 导游查询v2 import query
from 导游录入智游宝 import dy
# 配置日志记录
logging.basicConfig(filename='log.txt', level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s')
# 定义一个线程函数,用于执行 query() 函数
def query_thread():
while True:
try:
query()
except Exception as e:
logging.error(f"An error occurred: {e}")
# 发生异常时执行重启操作
restart_program()
time.sleep(10)
# 定义一个线程函数,用于执行 dy() 函数
def dy_thread():
while True:
try:
dy()
except Exception as e:
logging.error(f"An error occurred: {e}")
# 发生异常时执行重启操作
restart_program()
time.sleep(20)
# 创建两个线程并分别启动
t1 = threading.Thread(target=query_thread)
t2 = threading.Thread(target=dy_thread)
t1.start()
t2.start()
# 重启程序函数
def restart_program():
t1.join()# 等待线程 t1 结束
t2.join()# 等待线程 t2 结束
# 在这里执行重启操作,例如重新启动Python解释器或调用主程序的入口函数
os.execl(sys.executable, sys.executable, *sys.argv)# 重新启动Python解释器
# 或者调用主程序的入口函数
# main()# 请根据实际情况调用你的主程序入口函数
# 主程序入口
if __name__ == "__main__":
while True:
time.sleep(60)# 每隔一段时间进行一次重启条件检查
restart_program()
有些数据库并不支持多线程,你需要给他加一个打开锁。(不是读写锁,是打开锁) 楼上的意见很好.你考虑一下 qqLinux 发表于 2023-6-5 15:47
有些数据库并不支持多线程,你需要给他加一个打开锁。(不是读写锁,是打开锁)
好的,我研究一下,初学还是不太懂。 本帖最后由 ufo0033 于 2023-6-6 10:15 编辑
把catch 后的restart_program() 分别换成pass
restart_program用不着 while True 重启,执行一次 就行了。
两个子进程会在 设定的时间自动重新查询 报错会忽略 本帖最后由 13450774262 于 2023-6-5 16:42 编辑
为你提供一个gpt的回答,你做下参考
根据提供的报错信息,出现了一个严重的Python错误。该错误是由C扩展中的引用计数错误引起的,可能是因为未正确处理引用计数导致的。这种错误比较复杂,通常需要对代码进行深入的调试和分析。然而,出现这种错误时,通常建议采取以下步骤来解决问题:
[*]更新Python和相关依赖:确保你使用的是最新版本的Python和相关库。使用较新的版本可能修复了已知的问题。
[*]检查C扩展模块:如果你在代码中使用了C扩展模块,确保它们是最新的版本,并且与你使用的Python版本兼容。有时,C扩展模块的旧版本可能与新版本的Python不兼容,导致引用计数错误。
[*]检查代码逻辑:仔细检查你的代码逻辑,特别是多线程相关的部分。确保你正确处理线程同步、资源访问等问题。引用计数错误通常与并发访问共享资源有关。
[*]使用调试工具:使用Python的调试器,如pdb,来逐步跟踪代码执行并观察引用计数的变化。这有助于找到可能导致错误的地方。
[*]缩小问题范围:如果可能,尝试在简化的环境中复现该错误。逐步删除代码的部分,直到找到引发错误的特定部分。
ufo0033 发表于 2023-6-5 16:34
把报错后的restart_program() 分别换成query_thread() 和 dy_thread() 试试。 另外 while True放在 ...
我先试试这个 13450774262 发表于 2023-6-5 16:39
为你提供一个gpt的回答,你做下参考
根据提供的报错信息,出现了一个严重的Python错误。该错误是由C扩 ...
谢谢,gpt 我已经搜索过了, 这个 错误 就是看不懂,所以我才这个上面问的
页:
[1]
2