我有一个自定义的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>
答案 0 :(得分:0)
如果您使用的是Python requests
库with a custom HTTP verb和need 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机制)与其他应用/服务进行通信。