Как добавить асинхронные таски в код?
async def main(sticker_dict, orders_dict):
url = "wss://wsn.dota2.net/wsn/"
try:
print("Коннект")
async with websockets.connect(url, ping_interval=None) as client:
print("Успешно")
await client.send("newitems_go")
# await client.send("PINGPONG")
await client.ping()
tasks = []
while True:
tasks.append(asyncio.create_task(get_tasks(client, sticker_dict, orders_dict)))
if len(tasks) == 200:
await asyncio.gather(*tasks)
tasks = []
except Exception as drop_connection:
print(drop_connection)
print("Соединение упало!")
async def get_tasks(client, sticker_dict, orders_dict):
raw_data = json.loads(await client.recv())["data"]
data = eval(raw_data)
try:
"""
Тут мы узнаем есть ли у данного предмета стикеры, которые нам нужны.
И все нужные стикеры добавляем в общий список, для того чтобы потом
при отправке сообщения указать, какие стикеры есть у данного предмета
"""
stickers = data["stickers"]
stickers = stickers.split("|")
necessary_stickers = []
for sticker in stickers:
if sticker in sticker_dict:
sticker_name = sticker_dict.get(sticker)
necessary_stickers.append(sticker_name)
if len(necessary_stickers) > 0:
if data['i_classid'] not in orders_dict:
await generate_message(data, orders_dict, necessary_stickers)
elif orders_dict.get(data['i_classid'])['ui_price'] - int(data['ui_price']) > 50:
await generate_message(data, orders_dict, necessary_stickers)
except KeyError:
pass
async def generate_message(data, orders_dict, stickers):
orders_dict[data['i_classid']] = data
item_id = f"{data['i_classid']}-{data['i_instanceid']}"
for admin_id in ADMINS:
text_message = [
"Новый предмет!",
f"Лот: {data['i_market_hash_name']}",
f"Цена: {data['ui_price']} {data['ui_currency']}",
f"Стикеры: {', '.join(stickers)}\n",
f"Ссылка: https://market.csgo.com/item/"
f"{data['i_classid']}-{data['i_instanceid']}"
]
purchase_request = f"https://market.csgo.com/api/v2/buy?" \
f"key={api_key}&id={data['ui_id']}&price={str(round(data['ui_price'] * 100))}"
await bot.send_message(admin_id, text="\n".join(text_message),
disable_web_page_preview=True,
reply_markup=generate_buy_keyboard(item_id, purchase_request))
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main(sticker_dict, orders_dict))
Ошибка:
base_events.py [LINE:1753] #ERROR [2022-08-22 20:44:10,165] Future exception was never retrieved
future: <Future finished exception=ConnectionClosedError('code = 1006 (connection closed abnormally [internal]), no reason')>
websockets.exceptions.ConnectionClosedError: code = 1006 (connection closed abnormally [internal]), no reason
cannot call recv while another coroutine is already waiting for the next message
Изначально код был в две функции, но я решил добавить таски, из-за чего мне пришлось добавить функцию get_tasks и перетащить туда код. Но в итоге вылетела эта ошибка.