Как обрабатывать обратные вызовы в Python 3? - PullRequest
2 голосов
/ 30 мая 2019

У меня есть собственный метод HTTP / глагол (скажем, LISTEN), который позволяет мне прослушивать обновление ресурса, хранящегося на удаленном сервере. API, доступный для этого, имеет блокирующий вызов, который заставит мой клиентский код прослушивать обновление, пока я не прерву выполнение этого вызова. Просто, чтобы привести пример, если бы я должен был выполнить скручивание следующим образом:

curl -X LISTEN http://<IP-Address>:<Port>/resource

Выполнение этого создает блокирующий вызов, предоставляя мне обновления ресурса всякий раз, когда новое значение для этого ресурса передается на сервер (аналогично модели pub-sub), ответ на который будет выглядеть примерно так:

{"data":"value update 1","id":"id resource"}
{"data":"value update 2","id":"id resource"}
(...)

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

1 Ответ

0 голосов
/ 30 мая 2019

Если вы используете Python requests lib с пользовательским HTTP-глаголом и необходимо прочитать потоковый контент , вы можете сделать что-то вроде этого:

import json
import requests  # sudo pip3 install requests


url = "http://........."
r = requests.request('LISTEN', url, stream=True)
for line in r.iter_lines():
    # filter out keep-alive new lines
    if line:
        decoded_line = line.decode('utf-8')
        print(json.loads(decoded_line))

Примечание: по умолчанию все requests вызовы блокируются, поэтому вам нужно запустить этот код в отдельном потоке / процессе, чтобы избежать этого.

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

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

Ваша задача может быть решена многими способами . Решение зависит от архитектуры вашего приложения.

Если это веб-сервер, вы можете взглянуть на tornado (см. потоковый обратный вызов ) или aiohttp потоковых примеров.

С другой стороны, вы можете запустить приведенный выше код в отдельном процессе и взаимодействовать с другими приложениями / службами, например, с помощью RabbitMQ (или другого механизма ipc ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...