Gui(pyqt5)滞后很多,然后python崩溃

Posted

技术标签:

【中文标题】Gui(pyqt5)滞后很多,然后python崩溃【英文标题】:Gui(pyqt5) lags a lot, and then python crashing 【发布时间】:2019-09-08 16:51:23 【问题描述】:

我正在尝试为我的程序做 GUI/控制中心。它工作正常,但不会持续很长时间。所以,我有两个液晶数字,我想尽快刷新小部件。

代码有 3 个部分:

    主要 访问实时数据的函数 Qt Designer 制作的 GUI

第一:

import sys  
from PyQt5 import QtWidgets, QtCore
import untitled  
import tweepy
from configuration import *
import datetime
import pandas as pd
import time
from bitmex import bitmex
from configuration import *
from strategy import Strategy
from trader import Trader
import json
import operator
import sys
from xbt import get_data


class ExampleApp(QtWidgets.QMainWindow, untitled.Ui_MainWindow):

    def __init__(self):
        # 
        super().__init__()
        self.setupUi(self)  # initial UI
        self.pushButton.clicked.connect(self.tweet)  # tweet if pressed

    def tweet(self):

        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)

        api = tweepy.API(auth)

        # If the authentication was successful, you should
        # see the name of the account print out
        print(api.me().name)

        # If the application settings are set for "Read and Write" then
        # this line should tweet out the message to your account's
        # timeline. The "Read and Write" setting is on https://dev.twitter.com/apps
        api.update_status(status='Tweet about last order')

这是我认为导致它的主要部分。我认为在 main 中使用计时器不好,但我在 *** 上找到了该解决方案。 !

def main():

    app = QtWidgets.QApplication(sys.argv)  
    window = ExampleApp()  
    window.setupUi(window)

    def update_label():
        current_time = str(datetime.datetime.now().time())
        window.label_3.setText(current_time)
    def update_lcd_delta():
        price = str(get_data.get_data_gui())
        window.lcdNumber.display(price)

    def actual_price_lcd():
        actual_price_xbt = str(get_data.price_xbt())
        window.lcdNumber_2.display(actual_price_xbt)

    timer = QtCore.QTimer()
    timer.timeout.connect(update_label) #update_label with current time
    timer.start(10000)  # every 10,000 milliseconds
    timer2 = QtCore.QTimer() #update lcd number with another number
    timer2.timeout.connect(update_lcd_delta)  
    timer2.start(10000)

    timer3 = QtCore.QTimer()
    timer3.timeout.connect(actual_price_lcd)  #update 
    timer3.start(100)

    window.show()  
    app.exec_()  


if __name__ == '__main__':  
    main()  

获取数据的第二部分(工作正常):

import pandas as pd

from bitmex import bitmex
from configuration import *


class get_data():

    def get_data_gui():

        client = bitmex(test=TEST_EXCHANGE, api_key=API_KEY, api_secret=API_SECRET)


        prices_now = pd.DataFrame(client.Trade.Trade_getBucketed(  # get 24 candles with unfinished one
                binSize='1h',
                partial=True,
                symbol='XBTUSD',
                count=24,
                reverse=True
            ).result()[0])
        prices_now.set_index(['close'], inplace=True)
        delta = (prices_now['high'].max() - prices_now['low'].min()) / prices_now['low'].min()

        return delta

    def price_xbt():

        client = bitmex(test=TEST_EXCHANGE, api_key=API_KEY, api_secret=API_SECRET)

        order_book = pd.DataFrame(client.OrderBook.OrderBook_getL2(  # get orderbook
                symbol='XBTUSD',
                depth=2
                # 0 is full depth, using 200-300 we can adjust speed from 0.5 seconds to 0.1 (depends from bitmex)
            ).result()[0])
        print(order_book)
        order_book.set_index(['price', 'size', 'side'], inplace=False)
        price_first_bid = order_book.loc[order_book[order_book.side == 'Buy'].index[0], 'price']
        print(price_first_bid)
        return price_first_bid

据我了解,我有内存泄漏。我该如何解决?

这是崩溃信息:

    REGION TYPE                        SIZE    COUNT (non-coalesced) 
===========                     =======  ======= 
Accelerate framework               128K        1 
Activity Tracing                   256K        1 
CG backing stores                 5944K        3 
CG image                            16K        2 
CoreGraphics                         8K        1 
CoreImage                           24K        2 
CoreUI image data                 1372K        7 
CoreUI image file                  404K        4 
Dispatch continuations            8192K        1 
Kernel Alloc Once                    8K        1 
MALLOC                           208.3M       85 
MALLOC guard page                   32K        7 
MALLOC_LARGE (reserved)            128K        1         reserved VM address space (unallocated)
Memory Tag 242                      12K        1 
STACK GUARD                         20K        5 
Stack                             18.0M        5 
VM_ALLOCATE                        108K       10 
VM_ALLOCATE (reserved)            32.0M        1         reserved VM address space (unallocated)
__DATA                            30.4M      397 
__FONT_DATA                          4K        1 
__LINKEDIT                       238.3M      116 
__TEXT                           276.3M      362 
__UNICODE                          564K        1 
mapped file                       57.8M       22 
shared memory                      632K       10 
===========                     =======  ======= 
TOTAL                            878.6M     1047 
TOTAL, minus reserved VM space   846.5M     1047 

我想快速更新这个液晶屏数字。怎么做才合适?

【问题讨论】:

【参考方案1】:

我对此知之甚少,但我认为主要的泄漏原因是您正在与timer3 进行每秒 10 次客户端连接。这是很多获取信息的尝试。据我所知,您甚至可能会更好地创建一个全局client,我认为泄漏是创建太多(每秒 10 个 + 每 10 秒 2 个)客户端的结果。在您开始时制作一个可能会做,我认为当客户超出范围时某些事情不会被清除。

另一个延迟的原因是更新和查询数据库很慢,我认为 QTimers 只是在主线程中运行回调,这意味着等待这些更新也会减慢 GUI。您需要在线程中完成繁重的工作,然后只需使用计时器将您已有的信息获取到 GUI。这也可能是导致内存泄漏的原因,但我不知道为什么会这样。

不管怎样,我认为你应该解决这两个问题:

重复使用您的 client 变量,不要在每次调用时都重新创建它。 计时器调用的函数需要快速执行操作,让数据库内容在线程中发生,并使用计时器通过线程收集的信息更新 GUI。这里的主要问题是timer3 每秒对该数据库进行 10 次调用。

【讨论】:

以上是关于Gui(pyqt5)滞后很多,然后python崩溃的主要内容,如果未能解决你的问题,请参考以下文章

活动期间 GUI 没有变化? (Python3.6,PyQt5)

在不终止启动 Python 脚本的情况下关闭 pyqt5 GUI

Python 3.5,单独窗口中的 pyqt5 进度条 gui

Python-GUI编程-PyQt5

熟悉PyQt5 与 Eric6 的 GUI 开发

python GUI编程(基于PyQt5)