Получить данные из подписки Redis невозможно? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь получить данные из канала Redis, используя подписку на моем клиентском приложении.Для этой цели я использую python с asyncio и aioredis.

Я хотел бы использовать свою подписку, чтобы обновлять переменную моего основного приложения при изменении этого на сервере, но я не могу передать данныеполучено из подписки на мою основную ветку.

Согласно aioredis website , я реализовал свою подписку с:

sub = await aioredis.create_redis(
     'redis://localhost')

ch1 = await sub.subscribe('channel:1')
assert isinstance(ch1, aioredis.Channel)

async def async_reader(channel, globarVar):
    while await channel.wait_message():
        msg = await channel.get(encoding='utf-8')
        # ... process message ...
        globarVar = float(msg)
        print("message in {}: {}".format(channel.name, msg))

tsk1 = asyncio.ensure_future(async_reader(ch1, upToDateValue))

Но я не могу обновить глобальную переменнуюЯ предполагаю, что Python передаст только текущее значение в качестве аргумента (что я ожидал, но хотел быть уверен).

Есть ли какой-либо жизнеспособный вариант для получения данных из подписки?или передать ссылку на общую переменную или очередь, которую я мог бы использовать?

1 Ответ

0 голосов
/ 15 февраля 2019

Вам следует изменить код, чтобы вам не требовалась глобальная переменная.Вся ваша обработка должна происходить при получении сообщения.Однако для изменения глобальной переменной необходимо объявить ее в функции с ключевым словом global.Вы не передаете глобальные переменные - вы просто используете их.

Sub:

import aioredis
import asyncio
import json

gvar = 2

# Do everything you need here or call another function
# based on the message.  Don't use a global variable.
async def process_message(msg):
  global gvar
  gvar = msg

async def async_reader(channel):
  while await channel.wait_message():
    j = await channel.get(encoding='utf-8')
    msg = json.loads(j)
    if msg == "stop":
      break
    print(gvar)
    await process_message(msg)
    print(gvar)

async def run(loop):
  sub = await aioredis.create_redis('redis://localhost')
  res = await sub.subscribe('channel:1')
  ch1 = res[0]
  assert isinstance(ch1, aioredis.Channel)

  await async_reader(ch1)

  await sub.unsubscribe('channel:1')
  sub.close()

loop = asyncio.get_event_loop()
loop.run_until_complete( run(loop) )
loop.close()

Издатель:

import asyncio
import aioredis

async def main():
    pub = await aioredis.create_redis('redis://localhost')

    res = await pub.publish_json('channel:1', ["Hello", "world"])
    await asyncio.sleep(1)
    res = await pub.publish_json('channel:1', "stop")

    pub.close()


if __name__ == '__main__':
    asyncio.get_event_loop().run_until_complete(main())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...