python 服务器端怎么实现当有某个 get 请求时才返回之前的某个请求的结果呢?

2017-01-03 17:44:16 +08:00
 sonack

比如客户端有 A 和 B ,服务端是 S A 向 S 请求某个数据,但 S 还没有该数据,于是一直等待或挂起当前进程,直到 B 用 post 方法向 S 传送了某些数据 data 以后, S 处理 A 的进程或线程才返回呢?

我用的 Flask 好像做不到啊,有什么简单的 demo 可以参考吗?

谢谢

2121 次点击
所在节点    问与答
8 条回复
wwqgtxx
2017-01-03 18:25:12 +08:00
用个 queue 不就行了,不过这样很容易造成 http 超时以及程序死锁,请谨慎使用
Kilerd
2017-01-03 18:25:29 +08:00
1 、 可以考虑下 socket 或者 websocket 这些的双向传输的方法

2 、 队列处理问题。

A 向 S 发送一个事件, S 登记事件之后,返回一个 事件 ID 。 之后 A 定时向 S 查询 事件是否完毕。 S 收到查询信息,完毕了就返回事件处理结果。
sonack
2017-01-03 19:19:40 +08:00
我现在这样实现的。。。
用 python 的 aiohttp

import asyncio

from aiohttp import web

test = False

async def index(request):
global test
print('index test=',test)
test = True
print('index changed=',test)
return web.Response(body=b'<h1>Index</h1>',content_type='text/html')

async def hello(request):
print("start");
while True:
await asyncio.sleep(0.5)
print('test = ' , test)
if test:
break
print("end");
text = '<h1>Hello, %s!</h1>' % request.match_info['name']
return web.Response(body=text.encode('utf-8'),content_type='text/html')

async def init(loop):
app = web.Application(loop=loop)
app.router.add_route('GET', '/', index)
app.router.add_route('GET', '/hello/{name}', hello)
srv = await loop.create_server(app.make_handler(), '127.0.0.1', 8000)
print('Server started at http://127.0.0.1:8000...')
return srv

loop = asyncio.get_event_loop()
loop.run_until_complete(init(loop))
loop.run_forever()


访问 hello 不会立即返回。除非另外一个访问了 index 。。。。

不知道这样做有没有什么问题
zmj1316
2017-01-03 21:03:17 +08:00
为什么不让 a 定时轮询呢?一直挂起阻塞着不好吧 ,又不是 websocket
tonghuashuai
2017-01-04 00:19:36 +08:00
这不就是 websocket 的应用场景吗?
sonack
2017-01-04 00:45:42 +08:00
请问有什么推荐的书来学习 websocket 吗
binux
2017-01-04 01:29:43 +08:00
概念上没有问题,细节上还能够提升。
appleorchard2000
2017-01-04 10:25:31 +08:00
不必让 hello 一直死等吧,在 index 仍未被访问的情况下,可以让 hello 返回空的结果; index 访问的结果,都暂存在一个数据容器里,临时列表之类的,等街 hello 来取。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/331955

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX