Есть две бесконечные задачи с Asyncio - PullRequest
0 голосов
/ 06 сентября 2018

Я новичок в python, и мне нужно создать программу, которая будет поддерживать линзы от web-сокета и канала, поэтому мне нужны две асинхронные функции.Каждая из этих функций вызывает другой метод в различном thrad, который уточняет содержание полученного json.то есть я получаю сообщение в потоке сокета, получаю сообщение и создаю новый поток для разработки сообщения.
Это фактический код:

import asyncio
import sys
import json
import websockets

# Keep listening from web socket and pipe


async def socket_receiver():
    """Listening from web socket"""
    file_socket = open(r"SocketReceived.txt", "w")
    header = {"Authorization": r"Basic XXXXXXXXXXXXXX="}
    async with websockets.connect(
            'wss://XXXXXXXXX', extra_headers=header) as web_socket:
        print("SOCKET receiving:")
        greeting = await web_socket.recv()
        json_message = json.loads(greeting)
        file_socket.write(json_message)
        print(json_message)

    file_socket.close()

async def pipe_receiver():
    """Listening from pipe"""
    file_pipe = open(r"ipeReceived.txt", "w")
    while True:
        print("PIPE receiving:")
        line = sys.stdin.readline()
        if not line:
            break

        jsonObj = json.loads(line);
        file_pipe.write(jsonObj['prova'] + '\n')
        # jsonValue = json.dump(str(line), file);
        sys.stdout.flush()

    file_pipe.close()
asyncio.get_event_loop().run_until_complete(socket_receiver())
asyncio.get_event_loop().run_until_complete(pipe_receiver())

run_until_complete метод keep навсегда в моем случае(он ожидает окончания функции), поэтому запускается только сокет.Как я могу начать оба?Спасибо

1 Ответ

0 голосов
/ 06 сентября 2018

asyncio.gather добивается цели, единственное, что обе функции должны совместно использовать один и тот же цикл обработки событий, и обе должны быть полностью асинхронными.

asyncio.get_event_loop().run_until_complete(
    asyncio.gather( socket_receiver(),pipe_receiver()))

Из быстрого чтения pipe_receiver вы повесите свой цикл обработки событий в вызове sys.stdin.readline, пожалуйста, рассмотрите возможность использования aioconsole для асинхронной обработки ввода.

...