Python 代码卡住了,甚至 CTRL+C 也无济于事

Python Code gets stuck, not even the CTRL+C helps to exit

提问人:Lokesh Giri 提问时间:6/22/2023 最后编辑:Lokesh Giri 更新时间:6/27/2023 访问量:98

问:

我已经编写了代码来使用 Websockets 接收实时市场数据,我从主循环中分析数据(迭代之间的休眠时间为 0.1 秒)并根据当前市场水平做出交易决策,在主循环中我还每 10 秒左右打印一次统计数据。整个代码在 0.001 秒内执行(除了在极少数情况下),因此每个循环大约需要 0.101 秒(认为这些数字可能会有所帮助)。代码每天运行 375 分钟,我主要使用 Visual Code Studio 在 Windows 10 64 位上编写/编辑和运行代码。

我面临的问题是执行有时会冻结,代码不打印更新,根本不执行任何内容,陷入昏迷。即使按 CTRL+C,我也无法摆脱它。如果问题是因为命令在永恒循环中丢失在代码的某个角落,我们应该能够通过按 CTRL+C 退出它,对吧?起初我以为这是Visual Studio Code的问题,当我尝试通过IDLE运行代码时也会发生同样的情况

似乎是一些基本的 Python 问题,知识渊博的编码人员可能能够查明,请帮我找到错误。提前致谢

我尝试了一些步骤来加速 Visual studio Code,卸载了我不需要的扩展。但这看起来不像 VSC 问题。我没有想法了

编辑:

我了解到,问题很可能是由于对经纪人的 http 请求没有返回确认而发生的(经纪人确认订单将处于永恒等待状态,既没有拒绝也没有完成)

所以下面是示例代码的样子:


import time
import api

is_in_position=0

def isExit():
    # If exit is necessary return 1 else return 0

def createPosition():
    try:
       result=api.placeOrder('qty'=100, 'action'='buy')
       if result['status']=='OK':
               is_in_position=1
    except:
        print("An Exception has happened (1)")
    
def checkPositionsForChanges():
    # Check Positions, exit if the move is against you
    is_exit=isExit()
    if is_exit:
        try:
            result=api.placeOrder('qty'=100, 'action'='sell')
           if result['status']=='OK':
               is_in_position=2
        except:
            print("An Exception has happened (2)")


# THE MAIN WHILE LOOP
while True:
    if  is_in_position==0:
        createPosition()
        is_in_position=1
     elif is_in_position==1:
        checkPositionsForChange()
     elif is_in_position==2:
        break
    time.sleep(1)

问题来自

result=api.placeOrder('qty'=100, 'action'='buy')

api.placeOrder 是一个代理 SDK 函数,它不会抛出任何异常,甚至没有超时错误,我无法控制它。

我该如何解决它,以便经纪人的不响应不会让我停滞不前

python-3.x visual-studio-code 调试 错误处理

评论

1赞 Galo Torres Sevilla 6/22/2023
那里可能发生的事情太多了。我要确保的一件事是 SIGINT 不会在代码中的某个地方被覆盖。如果是这样,那可能是不提高的原因KeyboardInterrupt
0赞 rioV8 6/22/2023
为什么要从 IDE 或 IDLE 运行代码,只需从命令行运行它,您是否在调试器中运行它以进行生产执行
0赞 Lokesh Giri 6/22/2023
@rioV8请您解释一下吗?口译员在这里有错吗?我一定会努力的。谢谢
0赞 Lokesh Giri 6/22/2023
@GaloTorresSevilla我是 Python 的新手,我不知道该怎么做,但很可能我在不知不觉中做了一些:)
0赞 Ben the Coder 6/22/2023
请提供足够的代码,以便其他人可以更好地理解或重现问题。

答:

1赞 Jose Francisco Carreo Martinez 6/22/2023 #1

正如你提到的,你的问题似乎是代码正在进入一个无法退出的循环。Ctrl+C 命令在当前命令完成后立即执行,但如果此命令是一个非常大的计算(或可能超时的 API 调用),则它不起作用,您需要强制停止执行 VSCode。

不看代码,很难找到确切的问题,但我可能会在收到您的股票数据时尝试添加超时。

希望这有帮助!

评论

0赞 Lokesh Giri 6/22/2023
“正如你所提到的,你的问题似乎是代码正在进入一个无法退出的循环。我认为这不是问题所在。是的,这是有道理的。我使用 websockets(每秒大约 500 次更新,自动将数据更新到列表中),然后每 0.1 秒对更新运行一次分析,当然可能会出现一些混乱。感谢您的输入