asyncio_redis.exceptions.Error: Cannot run command inside pubsub subscription.

225 views
Skip to first unread message

133...@gmail.com

unread,
Feb 22, 2016, 6:20:28 AM2/22/16
to aio-libs
либо я туплю, либо какая то странная асинхронность. почему в то время когда один хандлер ждет события, я не могу из другого сделать hset.


self.loop.run_until_complete(asyncio.gather(self.handle_get_redis_msg(), self.handle_worker()))

while True:
await asyncio.sleep(1)
await self.redis.hset('XXX', 'XXX', 'XXX')

async def handle_get_redis_msg(self):
if not self.redis:
await self.get_redis()
subscribe_list = ['YYY']
if not self.pubsub:
self.pubsub = await asyncio.wait_for(self.redis.start_subscribe(), 1)
await asyncio.wait_for(self.pubsub.subscribe(subscribe_list), 1)
while True:
msg_redis = await self.pubsub.next_published()
if msg_redis:
a = 1


Andrew Svetlov

unread,
Feb 22, 2016, 7:34:13 AM2/22/16
to 133...@gmail.com, aio-libs

А у self.redis какой тип?


--
You received this message because you are subscribed to the Google Groups "aio-libs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to aio-libs+u...@googlegroups.com.
To post to this group, send email to aio-...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/aio-libs/a2ef4ee0-43b4-4c5a-8fbf-5bb3f055cac0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--
Thanks,
Andrew Svetlov

133...@gmail.com

unread,
Feb 22, 2016, 7:58:45 AM2/22/16
to aio-libs, 133...@gmail.com
try:
if 'poolsize' in kwargs:
self.redis = await asyncio.wait_for(
asyncio_redis.Pool.create(host=host, port=port, db=db, **kwargs), 1)
else:
self.redis = await asyncio.wait_for(
asyncio_redis.Connection.create(host=host, port=port, db=db, **kwargs), 1)

Намек понял.
 

понедельник, 22 февраля 2016 г., 15:34:13 UTC+3 пользователь Andrew Svetlov написал:

133...@gmail.com

unread,
Feb 22, 2016, 8:00:43 AM2/22/16
to aio-libs, 133...@gmail.com
т.е. чтение очереди всегда съедает один поток и в моем случае надо для всех других операций использовать poolsize не меньше 2?

понедельник, 22 февраля 2016 г., 15:58:45 UTC+3 пользователь 133...@gmail.com написал:

Andrew Svetlov

unread,
Feb 22, 2016, 8:25:05 AM2/22/16
to 133...@gmail.com, aio-libs

Одно соединение к редису блокируется ожиданием сообщения от pubsub



For more options, visit https://groups.google.com/d/optout.
--
Thanks,
Andrew Svetlov

133...@gmail.com

unread,
Feb 22, 2016, 11:33:34 AM2/22/16
to aio-libs, 133...@gmail.com
а это нормально?
а как в принципе устроено ожидание сообщения от pubsub - в бесконечном цикле опрашивается редис? если да то с какой периодичностью?

понедельник, 22 февраля 2016 г., 16:25:05 UTC+3 пользователь Andrew Svetlov написал:

Andrew Svetlov

unread,
Feb 24, 2016, 6:35:40 AM2/24/16
to aio-libs, 133...@gmail.com
Это нормально. Редис не опрашивается периодически а клиент ждет сообщения от сервера.

133...@gmail.com

unread,
Feb 28, 2016, 4:03:34 AM2/28/16
to aio-libs, 133...@gmail.com
супер, а  на ожидание сообщений , если подписка на большое количество каналов, используется одно соединение?
не могу разобраться с объектом редиса, как понять чем занято соединение (ожиданием сообщения или командой)?
часто получаю сообщения о отсутствии свободных соединений, есть ли режим чтобы команды к редису set, hset и т.п.  ждали свободного соединения?

среда, 24 февраля 2016 г., 14:35:40 UTC+3 пользователь Andrew Svetlov написал:

Andrew Svetlov

unread,
Feb 28, 2016, 8:46:51 AM2/28/16
to Михаил Разговоров, aio-libs
2016-02-28 11:03 GMT+02:00 <133...@gmail.com>:
> супер, а на ожидание сообщений , если подписка на большое количество
> каналов, используется одно соединение?
одно соединение на один вызов subscribe

> не могу разобраться с объектом редиса, как понять чем занято соединение
> (ожиданием сообщения или командой)?
Можно думать, что subscribe -- тоже команда, которая выполняется очень долго.

> часто получаю сообщения о отсутствии свободных соединений, есть ли режим
> чтобы команды к редису set, hset и т.п. ждали свободного соединения?
Нет, такого режима нет. Соединениями управляет connection pool.
Получение соединения из pool может ждать.
> https://groups.google.com/d/msgid/aio-libs/d4f62ba9-b9bc-4b22-924b-e86437eb52e8%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages