如何处理Python 3中的回调?

时间:2019-05-30 13:43:39

标签: python python-3.x callback python-requests

我有一个自定义的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并处理阻止调用/回叫,同时确保这不会阻止其余代码的执行? / p>

1 个答案:

答案 0 :(得分:0)

如果您使用的是Python requestswith a custom HTTP verbneed to read stream content,则可以执行以下操作:

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调用都处于阻塞状态,因此您需要在单独的线程/进程中运行此代码,以免发生这种情况。

  

...同时确保这不会阻止其余代码的执行

由于您没有提供有关您的应用程序的详细信息,因此我将尝试列出一些有疑问的一般想法。

可以用许多方式解决您的任务。解决方案取决于您的应用架构。

如果这是一台Web服务器,则可以查看tornado(请参阅流回调)或aiohttp流示例。

另一方面,您可以在一个单独的过程中运行以上代码,并使用RabbitMQ(或其他ipc机制)与其他应用/服务进行通信。