LINUX.ORG.RU

python. asincio. Возврат значений из асинхронного кода

 ,


0

3

Пишу ходилку телнетом по железякам. Ходить она будет параллельно. Количество железяк 50+ .

Делаю на python (либа telnetlib3 на asincio )

Вот пример клиента telnet из документации:

import asyncio, telnetlib3

@asyncio.coroutine
def shell(reader, writer):
    while True:
        # read stream until '?' mark is found
        outp = yield from reader.read(1024)
        if not outp:
            # End of File
            break
        elif '?' in outp:
            # reply all questions with 'y'.
            writer.write('y')

        # display all server output
        print(outp, flush=True)

    # EOF
    print()

loop = asyncio.get_event_loop()
coro = telnetlib3.open_connection('localhost', 6023, shell=shell)
reader, writer = loop.run_until_complete(coro)
loop.run_until_complete(writer.protocol.waiter_closed)

Подскажите, пожалуйста, как правильно вернуть результат работы асинхронной функции shell в синхронный код в конце после run_until_complete.

Через rerutn не подходит, т.к. open_connection возвращает reader, writer



Последнее исправление: psm666 (всего исправлений: 1)

вернуть результат работы асинхронной функции shell в синхронный код

А зачем? Работай с outp внутри shell

@asyncio.coroutine
def save_to_db(data):
    pass

@asyncio.coroutine
def shell(reader, writer):
    while True:
        ...
        if not outp:
            break
        elif '?' in outp:
            writer.write('y')
        elif 'data:' in outp:
            yield from save_to_db(outp)
    ...
vvn_black ★★★★★
()
Ответ на: комментарий от vvn_black

вернуть результат работы асинхронной функции shell в синхронный код

А зачем? Работай с outp внутри shell

с outp буду конечно работать внутри shell, а вот результаты взаимодействия с железяками нужны извне - ответы железяк на команды будут отображаться на сайте (django)

psm666
() автор топика
Ответ на: комментарий от psm666

ответы железяк на команды будут отображаться на сайте (django)

Запиши в джанговский кеш или БД.

provaton ★★★★★
()
In [1]: import asyncio

In [2]: loop = asyncio.get_event_loop()

In [3]: async def test():
   ...:     return 'lol'
   ...: 

In [4]: result = loop.run_until_complete(test())

In [5]: print(result)
lol

In [6]: 



Но в этом мало смысла. Делай всё в что тебе надо в той корутине, которую ты в run_until_complete передаёшь.

itn ★★★
()
Ответ на: комментарий от psm666

Странно. Сайт на джанге, а работаем в асинкио. Что сложного сделать сайт на асинкио?

demrnd
()
Ответ на: комментарий от itn

Приведенный вами пример не подходит, так как в run_until_complete я запускаю корутину которая создается через библиотечный вызов open_connection и возвращает не наш результат а - (reader, writer)

Но в этом мало смысла. Делай всё в что тебе надо в той корутине, которую ты в run_until_complete передаёшь.

делать в корутине все что надо не получится, так как корутин будет 50+ и блокирующие операции в корутине будут останавливать loop. также этот код общения по телнет будет в виде либы, которая помимо сайта, будет использоватся в утилите командной строки

psm666
() автор топика
Ответ на: комментарий от psm666

Приведенный вами пример не подходит, так как в run_until_complete я запускаю корутину которая создается через библиотечный вызов open_connection и возвращает не наш результат а - (reader, writer)

Я и говорил что в этом мало смысла.

делать в корутине все что надо не получится, так как корутин будет 50+ и блокирующие операции в корутине будут останавливать loop. также этот код общения по телнет будет в виде либы, которая помимо сайта, будет использоватся в утилите командной строки

Запускать овер9000 корутин - это норма.
Для работы с синхронным кодом есть run_in_executor.

Походу у тебя отсутствует фундаментальное понимание асинхронности, и то как это в питоне реализовано, в частности.

itn ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.