hoojpop
@hoojpop

RuntimeWarning: включите tracemalloc, чтобы получить трассировку выделения объекта, как исправить?

Работаю с PyQt5. Делаю приложение для логирования. Возникает проблема с потоком и asyncio.
Задача состоит в том, что при нажатие на кнопку, должна запуститься асинхронная функция, которая работает в постоянном цикле на проверку файлов и вывода полученных данных, полученные через условия.

Есть асинхронная функция, которую я вызываю через поток:

async def deathcount():
    PLAYER_DEATH = '.*?Got character ZDOID from (\w+) : 0:0'
    log = "c:/.../files/log.txt"
    while True:     
        with open(log, encoding='utf-8', mode='r') as f:
            f.seek(0,2)
            while True:
                line = f.readline()
                if(re.search(PLAYER_DEATH, line)):
                    pname = re.search(PLAYER_DEATH, line).group(1)
                    with open(file, 'a', newline='', encoding='utf-8') as dl:
                        ... ...
                        log(f"{gettime}{pname} умер!")
                await asyncio.sleep(0.2)


PLAYER_DEATH - переменная хранящая в себе строчку с регулярным выражением.
В постоянном цикле проверяется log.txt, на наличие строки из PLAYER_DEATH.

При нажатие на кнопку, по идеи должна сработать функция deathcount(), которая в итоге, при положительном ответе, должна вывести результат - log(f"{gettime}{pname} умер!")

Результат выводится с помощью потока, там же и вызываем функцию (deathcount()):
basic.py:
class QTextEditLogger(logging.Handler):

    def __init__(self, parent):
        super().__init__()

        self.PVELogs = QtWidgets.QPlainTextEdit(parent.centralwidget)
        self.PVELogs.setGeometry(QtCore.QRect(40, 50, 801, 491))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(10)
        self.PVELogs.setFont(font)
        self.PVELogs.setStyleSheet("background-color: rgb(30, 30, 30); color: rgb(255, 255, 255);")
        self.PVELogs.setReadOnly(True)
        self.PVELogs.setPlainText("")
        self.PVELogs.setObjectName("PVELogs")

    def emit(self, record):
        msg = self.format(record)
        self.PVELogs.appendPlainText(msg)

class PVP(QtWidgets.QMainWindow, QWidget, MainInterface):
    def __init__(self):
        super().__init__()

        self.setupUi(self) #init gui

        # logging
        logTextBox = QTextEditLogger(self)
        #logTextBox.setFormatter(logging.Formatter(f'{gettime}%(message)s'))
        logging.getLogger().addHandler(logTextBox)
        logging.getLogger().setLevel(logging.DEBUG)

        root_logger= logging.getLogger()
        root_logger.setLevel(logging.DEBUG)
        handler = logging.FileHandler('PVPLog.log', 'w', 'utf-8') 
        handler.setFormatter(logging.Formatter('%(name)s, %(asctime)s, [%(levelname)s], %(message)s'))
        root_logger.addHandler(handler)

        self.PVELogs.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) 

        self.thread = WorkThread()
        self.thread.threadSignal.connect(self.func2)           
        self.onPVE.clicked.connect(self.func1)      

    def func1(self):
        self.thread.start()

    def func2(self, value):
        deathcount() # Вызываем функцию ! ! !

class WorkThread(QtCore.QThread):
    threadSignal = QtCore.pyqtSignal(int)

    def __init__(self):
        super().__init__()

    def run(self):     
        for i in range(10):
            self.msleep(200)
            self.threadSignal.emit(i)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mw = PVP()
    mw.show()

    sys.exit(app.exec())
    
loop = asyncio.new_event_loop()
loop.create_task(deathcount())
asyncio.set_event_loop(loop)


В конце файла создал новый цикл событий, советуясь данной темы

В конце асинхронной функции стоит ожидание (await asyncio.sleep(0.2)).
Но в итоге всё равно что-то не так.

c:\..\..\..\programma\basic.py:132: RuntimeWarning: coroutine 'deathcount' was never awaited
  deathcount()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback


Попробовал вызвать цикл в самой функции func2:

def func2(self, value):
    loop = asyncio.new_event_loop()
    loop.create_task(deathcount())
    asyncio.set_event_loop(loop)


Уже другой результат, так ещё в приложение появились интересные строчки:

C:\Users\Stepan\AppData\Local\Programs\Python\Python39\lib\asyncio\base_events.py:667: RuntimeWarning: coroutine 'deathcount' was never awaited
  self._ready.clear()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback


60c1c3a922790329840224.png

-
Весь код
-
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 1
LaRN
@LaRN
Senior Developer
А не может такого быть, что после того как вызывается mw.show() поток управления больше не возвращается в basyc.py до закрытия виджета и код
loop = asyncio.new_event_loop()
loop.create_task(deathcount())
asyncio.set_event_loop(loop)
не выполняется.
Может имеет смысл перести этот код до кода
if __name__ == "__main__":
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы