Ошибка травления Python3 в многопоточном приложении при зависании приложенияPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка травления Python3 в многопоточном приложении при зависании приложения

Сообщение Anonymous »

У меня есть приложение Python 3.10.11, которое отлично работает при разработке. Однако после заморозки приложения с помощью PyInstaller (приложение для ПК) выдается ошибка, в которой говорится, что «невозможно выбрать объект _struct.Struct», я определил точную строку, в которой возникает ошибка. Однако мне не удалось полностью решить эту проблему.
Приложение открывает два основных процесса: процесс графического интерфейса (PyWebView, рендеринг веб-интерфейса в виде окна рабочего стола) и серверный процесс (основной процесс: сервер FastAPI + рабочие). .
Основная цель приложения — связь с внешним устройством через объект под названием the_connection, который инициируется внешней библиотекой, поэтому назовем его «DeviceCommunicator», так что это функциональность сервера, позволяющая общаться с внешним устройством через «DeviceCommunicator»:
-> он начинается с Desktop_executor, который запускает основную функцию для запуска настольного приложения, затем
-> в файл рабочего стола для запуска двух процессов, сервера и окна, а затем
-> по запросу он запускается в конечной точке маршрута FastAPI, затем
-> получает объект подключения устройства из ConnectionChannel, который отслеживает подключенные внешние устройства, затем
-> вызывает функцию, которая выполняет действие или получает состояние внешнего устройства после передачи ему the_connection, чтобы оно могло взаимодействовать с устройством.
ПРИМЕЧАНИЕ. Я абстрагировал некоторые термины, чтобы устранить ненужные сложности, поскольку они не имеют значения.
Загруженные фрагменты кода для лучшего просмотра: https://paste.pythondiscord.com/NVHQ#2L16-L16
Я также размещу их здесь:
desktop_executor.py

Код: Выделить всё

from desktop import main
import platform
import multiprocessing

if __name__ == "__main__":
if platform.system() == "Darwin" or platform.system() == "Windows":
multiprocessing.set_start_method("spawn", force=True)
else:
multiprocessing.set_start_method("fork", force=True)

multiprocessing.freeze_support()
main()
desktop.py

Код: Выделить всё

import logging
import multiprocessing
import sys
from multiprocessing import Process
from os import environ, path

import webview
from server import run_server

APP_NAME = "XXXX"
PORT = 8123

bundle_dir = path.abspath(path.dirname(__file__))

def run_webview():
webview.create_window(
APP_NAME,
f"http://localhost:{PORT}",
fullscreen=True,
confirm_close=True,
)
webview.start(debug=False, menu=menu_items)

def main():
logging.basicConfig(filename=path.join(bundle_dir, "logs.txt"), level=logging.INFO)
window_process = Process(target=run_webview)
window_process.start()

run_server(desktop=True, port=PORT)

window_process.terminate()
server.py

Код: Выделить всё

import logging
import multiprocessing
import os
import platform
import ssl
import sys
from multiprocessing import Manager
from os import environ, path

if sys.stdout is None:
sys.stdout = open(os.devnull, "w")
if sys.stderr is None:
sys.stderr = open(os.devnull, "w")

import uvicorn
from dotenv import load_dotenv
from Device.ConnectionChannel import ConnectionChannel
from Device.DeviceRoutes import setup_all_routes
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware
from fastapi.staticfiles import StaticFiles

RECOMMENDED_MAX_WORKERS = (2 * multiprocessing.cpu_count()) + 1
print("Workers = ", RECOMMENDED_MAX_WORKERS)

app = FastAPI(
title="XXXX",
version="1.0.0"
)

connection_channel = ConnectionChannel()

def create_production_app(desktop=False):
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:8123"],
allow_credentials=True,
allow_methods=["GET", "POST", "PUT", "DELETE", "OPTIONS"],
allow_headers=["*"],
)
setup_all_routes(app, connection_channel)

HOST = "0.0.0.0"
INTERFACE = "asgi3"

setup_all_routes(app, connection_channel)

bundle_dir = path.abspath(path.dirname(__file__))

def run_server(desktop=False, port=8123):
global app
create_production_app(desktop)

if desktop:
path_to_frontend = path.join(bundle_dir, "frontend")
app.mount(
"/", StaticFiles(directory=path_to_frontend, html=True), name="static"
)

if platform.system() == "Windows":
connection_channel.set_multithreading_manager(Manager().dict())

server = uvicorn.Server(
config=uvicorn.Config(
"server:app",
port=port,
host=HOST,
workers=RECOMMENDED_MAX_WORKERS,
interface=INTERFACE
)
)
server.run()
DeviceCore.py

Код: Выделить всё

from DeviceCommunicator import connect # Just an abstraction for complexity

class Device:
def __init__(
self,
id: int = 0,
connection_url: str = "tcp:localhost:8080",
name: str = "Default",
) -> None:
# Assign Attributes Here...
pass

def connect(self) ->  bool:
try:
self.the_connection = connect(self.connection_url)
return True
except Exception as e:
print(str(e))
return False
DeviceRoutes.py

Код: Выделить всё

from Device.DeviceCore import Device
from fastapi import APIRouter, Request, Response as FastAPIResponse, status
import logging

router = APIRouter(
prefix="/device",
)

def setup_device_routes(connection_channel):
@router.post("/connect")
def connect(request):
device = Device(request["id", request["connection_url"], request["name"])
try:
result = connection_channel.add_connection(device)

device = connection_channel.get_device(request["id"])
print(device.the_connection) #  self.max_connections:
return

try:
did_connect = device.connect()
if did_connect == True:
self.connections.update({device.id: device}) #  

Подробнее здесь: [url]https://stackoverflow.com/questions/79358092/python3-pickling-error-in-multithreaded-application-upon-app-freezing[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Команда iOS atos – как найти адрес загрузки в отчете о зависании (файл .ips)?
    Anonymous » » в форуме IOS
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как избежать ошибки травления при определении функции внутри функции?
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Как избежать ошибки травления при определении функции внутри функции?
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Как избежать ошибки травления при определении функции внутри функции?
    Anonymous » » в форуме Python
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Подкласс набора травления вызывает нехешируемый тип: 'list'
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»