吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 876|回复: 12
收起左侧

[求助] python 循环总是出现问题

[复制链接]
wangwei0511 发表于 2023-6-5 15:09
30吾爱币
本帖最后由 wangwei0511 于 2023-6-5 15:11 编辑

写了两段代码,这两段代码(query和dy)都是不断的轮询 数据库(间隔10s、20s),如果数据库有新数据,就执行相应的操作。
我用一个主程序用两个线程,启动了这两段代码,但是总是运行差不多十多个小时就报错,

我的问题是,怎么才能正常的一直循环运行下去?

报错内容如下:
[Asm] 纯文本查看 复制代码
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>


代码如下:
[Python] 纯文本查看 复制代码
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)重启,修改了代码,希望帮到你。 [mw_shl_code=asm,true]import threading import time import logging import os import sys from 导游查询v2 import query from 导游录入智游宝 import dy ...

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

law.liu 发表于 2023-6-5 15:09
在重启程序函数中,执行restart_program()的方式也存在问题。该函数在主程序的上下文中,直接调用restart_program()无法正常重启。可以将重启操作移到主程序的外部,然后通过os.execl(sys.executable, sys.executable, *sys.argv)重启,修改了代码,希望帮到你。
[Asm] 纯文本查看 复制代码
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
有些数据库并不支持多线程,你需要给他加一个打开锁。(不是读写锁,是打开锁)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wangwei0511 + 1 + 1 谢谢@Thanks!

查看全部评分

zhgang908 发表于 2023-6-5 16:11
头像被屏蔽
saszznz 发表于 2023-6-5 16:14
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| wangwei0511 发表于 2023-6-5 16:33
qqLinux 发表于 2023-6-5 15:47
有些数据库并不支持多线程,你需要给他加一个打开锁。(不是读写锁,是打开锁)

好的,我研究一下,初学还是不太懂。
ufo0033 发表于 2023-6-5 16:34
本帖最后由 ufo0033 于 2023-6-6 10:15 编辑

把  catch 后的  restart_program() 分别换成  pass
restart_program  用不着 while True 重启,执行一次 就行了。
两个子进程会在 设定的时间自动重新查询 报错会忽略

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
wangwei0511 + 1 + 1 用心讨论,共获提升!

查看全部评分

13450774262 发表于 2023-6-5 16:39
本帖最后由 13450774262 于 2023-6-5 16:42 编辑


为你提供一个gpt的回答,你做下参考

根据提供的报错信息,出现了一个严重的Python错误。该错误是由C扩展中的引用计数错误引起的,可能是因为未正确处理引用计数导致的。这种错误比较复杂,通常需要对代码进行深入的调试和分析。然而,出现这种错误时,通常建议采取以下步骤来解决问题:
  • 更新Python和相关依赖:确保你使用的是最新版本的Python和相关库。使用较新的版本可能修复了已知的问题。
  • 检查C扩展模块:如果你在代码中使用了C扩展模块,确保它们是最新的版本,并且与你使用的Python版本兼容。有时,C扩展模块的旧版本可能与新版本的Python不兼容,导致引用计数错误。
  • 检查代码逻辑:仔细检查你的代码逻辑,特别是多线程相关的部分。确保你正确处理线程同步、资源访问等问题。引用计数错误通常与并发访问共享资源有关。
  • 使用调试工具:使用Python的调试器,如pdb,来逐步跟踪代码执行并观察引用计数的变化。这有助于找到可能导致错误的地方。
  • 缩小问题范围:如果可能,尝试在简化的环境中复现该错误。逐步删除代码的部分,直到找到引发错误的特定部分。

 楼主| wangwei0511 发表于 2023-6-5 16:39
ufo0033 发表于 2023-6-5 16:34
把  报错后的  restart_program() 分别换成  query_thread() 和 dy_thread() 试试。 另外 while True  放在 ...

我先试试这个
 楼主| wangwei0511 发表于 2023-6-5 16:47
13450774262 发表于 2023-6-5 16:39
为你提供一个gpt的回答,你做下参考

根据提供的报错信息,出现了一个严重的Python错误。该错误是由C扩 ...

谢谢,gpt 我已经搜索过了, 这个 错误 就是看不懂,所以我才这个上面问的
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-13 08:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表