Size: a a a

2020 April 21

P#

PyCodeCat # from meo... in aiogram [ru]
Gabben
Ты лоад сейв хочешь внутри контекста поставить?
Я хотел делать всё в одном контексте
источник

P#

PyCodeCat # from meo... in aiogram [ru]
Чтобы лишний раз не гулять в прокси
источник

G

Gabben in aiogram [ru]
В общем ещё раз скажу, что использовать state.get/set/update_data внутри блока async proxy() as data нельзя
источник

P#

PyCodeCat # from meo... in aiogram [ru]
Gabben
В общем ещё раз скажу, что использовать state.get/set/update_data внутри блока async proxy() as data нельзя
Ну это я использовал когда мне @martin_winks посоветовал
источник

P#

PyCodeCat # from meo... in aiogram [ru]
PyCodeCat # from meow import *
Судя по всему, ты хочешь понять, что не так и тебе нужно немного подробнее

Так вот, есть хендлер вроде такого:
@dp.message_handler(content_types=[ContentType.ALL], state=MyState.state)

async def record_msgs(m: Message, s: FSMContext):
   async with state.proxy() as data:
       item_id = data['id']
       id_: int = await put_into_db(m, item_id)  # не важно что оно делает
       data['new_data'].append(id_)
       return


И как только я пересылаю сообщения (т.е. отправляю их очень быстро), оно сохраняет так, как я показал выше.
До этого было ровно вот так
источник

G

Gabben in aiogram [ru]
Вот что бывает, когда нарушаешь дзен питона
источник

P#

PyCodeCat # from meo... in aiogram [ru]
а чо я нарушил? О.о :D
источник

G

Gabben in aiogram [ru]
Да мы все нарушили, зачем прокси, когда есть аналогичные методы у state, и эти два аналогичных способа (прокси и методы) ещё и нельзя смешивать
источник

G

Gabben in aiogram [ru]
Я в своих проектах отказался от прокси, всем рекомендую
источник

P#

PyCodeCat # from meo... in aiogram [ru]
Понимаю
источник

P#

PyCodeCat # from meo... in aiogram [ru]
Теперь так

@dp.message_handler(content_types=[ContentType.ALL], state=MyState.state)
async def record_msgs(m: Message, s: FSMContext):
   item_id = (await s.get_data())['id']
   id_: int = await put_into_db(m, item_id)
   new_data = (await s.get_data())['new_data']
   new_data.append(id_)
   await s.update_data(new_data=data)
источник

P#

PyCodeCat # from meo... in aiogram [ru]
Уже капельку лучше
Было:
b'{"id": 1, "new_data": [41, 45, 46, 47]}'

Стало:
b'{"id": 1, "new_data": [41, 45, 46, 47, 49]}'
b'{"id": 1, "new_data": [41, 45, 46, 47, 49, 51]}'
b'{"id": 1, "new_data": [41, 45, 46, 47, 49, 50]}'
источник

s

std::mpa in aiogram [ru]
PyCodeCat # from meow import *
Ну это я использовал когда мне @martin_winks посоветовал
только во время рекомендации я смотрел имплементацию FSMContext.
источник

s

std::mpa in aiogram [ru]
PyCodeCat # from meow import *
Уже капельку лучше
Было:
b'{"id": 1, "new_data": [41, 45, 46, 47]}'

Стало:
b'{"id": 1, "new_data": [41, 45, 46, 47, 49]}'
b'{"id": 1, "new_data": [41, 45, 46, 47, 49, 51]}'
b'{"id": 1, "new_data": [41, 45, 46, 47, 49, 50]}'
попробуй первый редис сторедж. там вроде лок используется при записи. вообще не пойму почему у тебя так с синхронизацией
источник

P#

PyCodeCat # from meo... in aiogram [ru]
std::mpa
попробуй первый редис сторедж. там вроде лок используется при записи. вообще не пойму почему у тебя так с синхронизацией
Не сработало

Короче, решил проблему чуть-чуть топорно
async with _lock:
на весь хендлер
источник

s

std::mpa in aiogram [ru]
гы, можешь сделать acquire потом release, чтобы не было лишних индентов.
источник

s

std::mpa in aiogram [ru]
или декорировать. но чот говно, что лок самого стореджа не синхронизирует.
источник

P#

PyCodeCat # from meo... in aiogram [ru]
std::mpa
гы, можешь сделать acquire потом release, чтобы не было лишних индентов.
Как-то пофиг
источник

P#

PyCodeCat # from meo... in aiogram [ru]
std::mpa
или декорировать. но чот говно, что лок самого стореджа не синхронизирует.
Там лок на запись. И я понял, что за ошибка
источник

P#

PyCodeCat # from meo... in aiogram [ru]
data = await get_data()  # 1
Потом контекст переключается
new_data = data.update_somehow_sync() # тут другая `data`
await set_data(new_data) # 0
Потом возвращается:
new_data = data.update_somehow_sync()
await set_data(new_data) # 1
источник