同步于设备之间
某些情形下,需要在不同的设备之间同步信息。设备之间互相无法访问对方的文件系统,这使得需要使用网络服务来实现同步。基于flask
和flask-restful
,本项目实现了LineHostBuffer
;基于urllib3
,本项目实现了LineHostMirror
。
下例提供了两个脚本(client.py
和host.py
)。服务端(host)需要在客户端(client)之前启动。接下来,所有来自client的信息都会被host捕获。
- 客户端(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)
host.py
import flask
from flask_restful import Api
import syncstream
app = flask.Flask('test')
api = Api(app)
syncstream.LineHostBuffer(api_route='/sync-stream', maxlen=10).serve(api)
if __name__ == '__main__':
app.run('localhost', port=5000)
缓存设计在服务侧。不过,用户并不需要针对服务端做任何处理。实例LineHostBuffer
仅仅用于为已经存在的Flask应用注册相应的API。在本例中,读写信息的过程都在client.py
中完成。在第一部分,客户端的stdout和stderr都重定向到了远端。每次调用print
时,信息就会推送到远端。所有信息都推送完毕后,会透过另一个请求来从远端获取结果。实际上,此处的读写操作可以分离到不同的脚本、甚至不同的设备上。
警告
某些包(例如pytest
)可能会需要重定向stdout和stderr。当使用这些包时,LineHostMirror
有可能无法成功将信息重定向到远端。