跳到主要内容
版本:0.3.x

同步于设备之间

某些情形下,需要在不同的设备之间同步信息。设备之间互相无法访问对方的文件系统,这使得需要使用网络服务来实现同步。基于flaskflask-restful,本项目实现了LineHostBuffer;基于urllib3,本项目实现了LineHostMirror

下例提供了两个脚本(client.pyhost.py)。服务端(host)需要在客户端(client)之前启动。接下来,所有来自client的信息都会被host捕获。

client.py
from contextlib import redirect_stdout, redirect_stderr
import requests
import syncstream

address = 'http://localhost:5000/sync-stream'
buffer = syncstream.LineHostMirror(address=address)

with redirect_stdout(buffer), redirect_stderr(buffer):
for i in range(3):
print('Message', f'"{i:02d}".')
print('Line break\nin middle.', end='')
print('No line break.', end='')

buffer.send_eof() # 发送终结信息。

# 以下部分可以分离到另一台设备上。
data = requests.get(address).json()['data']
for mitem in data:
print(mitem)

缓存设计在服务侧。不过,用户并不需要针对服务端做任何处理。实例LineHostBuffer仅仅用于为已经存在的Flask应用注册相应的API。在本例中,读写信息的过程都在client.py中完成。在第一部分,客户端的stdout和stderr都重定向到了远端。每次调用print时,信息就会推送到远端。所有信息都推送完毕后,会透过另一个请求来从远端获取结果。实际上,此处的读写操作可以分离到不同的脚本、甚至不同的设备上。

警告

某些包(例如pytest)可能会需要重定向stdout和stderr。当使用这些包时,LineHostMirror有可能无法成功将信息重定向到远端。