Перестали работать async func
После того, как смог подключить интерфейс PySide6 к асинхронным функциям возникла новая проблема. Асинхронные функции, вызванные из интерфейса перестали работать. Она как-бы выполняется, но до конкретных действий не доходит
import asyncio
from PySide6.QtCore import QThread, Signal
class AsyncioTaskCreator(QThread):
finished = Signal(str)
def __init__(self, task, *args, **kwargs):
super().__init__()
self.async_func = task
self.args = args
self.kwargs = kwargs
# self.loop = asyncio.new_event_loop()
# asyncio.set_event_loop(self.loop)
def run(self):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try:
loop.run_until_complete(self.async_func(*self.args, **self.kwargs))
finally:
loop.close()
self.finished.emit("Async task completed!")
Самописный класс для активации асинхронных функций внутри интерфейса PySide6. Вызывается следующим образом
self.worker = AsyncioTaskCreator(SteamWorker().create_orders, login = login)
self.worker.start()
В чем обстоит проблема: при вызове функции create_orders она как-бы выполняется вся, однако самая основная строка не выполняется почему-то. Ломаю голову - почему. Однако другие асинхронные функции, вызванные так-же в интерфейсе - работают. Возможно, проблема заключается в том, что другие функции не требуют колосального времени на их исполнение, однако полученные данные в них моментально сохраняются и распределяются в соответствии с кодом. А это функция предназначена для выставление в Steam запросов на покупку с учетом соответствующих критериев.
async def create_orders(self, login: str) -> None:
async with SteamClientManager(login) as client:
try:
row = 0
created_item = 0
error_count = 0
db = Database(base_adress_generator(login))
rows = db.execute("SELECT COUNT(*) FROM orders").fetchone()[0]
if await client.is_session_alive() is True:
try:
data = db.execute("SELECT * FROM orders").fetchall()
for query in data:
name = query[0]
game = query[1]
price = query[2]
quantity = query[3]
try:
if isPurchasing(login, name):
await client.place_buy_order(obj=name, app=get_app_id(game), price=price, quantity=quantity)
created_item += 1
await asyncio.sleep(4)
else:
continue
except Exception as e:
error = re.search(r"\d+", str(e))
if error:
err = int(error.group())
if err != 29 and error_count < 6:
error_count += 1
await asyncio.sleep(4)
elif err == 29:
await asyncio.sleep(4)
else:
break
row += 1
if row == int(rows):
break
except Exception as e:
error = re.search(r"\d+", str(e))
if error:
err = int(error.group())
make_log("warning", f"Market ({login})", f"Ошибка SteamAPI {error}! Ответ: {error_codes_api(error)} (for developer: {e})")
await asyncio.sleep(4)
else:
raise Exception("Session expired.")
except Exception as e:
error_wrapper(e)
SteamClientManager самописный класс тупо для авторизации при помощи менеджера контекста, поэтому там кода, необходимого показать - нет. Код доходит до await client.place_buy_order(obj=name, app=get_app_id(game), price=price, quantity=quantity) и далее проходит, однако никаких действий не происходит. Пытался принудительно выставлять в PySide6 при помощи QThreadPool.globalInstance().setMaxThreadCount(1) не помогает(по дефолту 12). Они запускаются (приложение и сама функция) в разных потоках (проверял через threads) однако все равно ничего не происходит. Напомню интересный факт, строка кода из другой функции
active_listings, to_confirm, buy_orders, count = await client.get_my_listings()
Работает прекрасно и безотказно. То есть при вызове функции, где есть строка указанная выше, соответственно с контекстным менеджером, все работает блестяще.
Есть идеи, почему это не работает?