http服务器异步响应,具有异步响应的Twisted http服务器,其中请求必须等待数据变为可用或...

我正在尝试编写一个简单的http服务器,用于处理在数据结构中查找响应或超时的异步请求:请求到达

While time<timeout检查responseCollector的响应(使用requestId作为键)

如果有响应,请返回

如果超时,则返回超时消息

我是twisted的新手,我想知道异步响应的最佳方式是什么。我看了看some twisted Deferred docs和callLater但是我不清楚我到底应该做什么。现在,我运行一个与deferToThread一起使用的阻塞方法,并等待超时时间过去。我得到延迟方法的字符串不可调用错误:Unhandled error in Deferred:

Traceback (most recent call last):

File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 497, in __bootstrap

self.__bootstrap_inner()

File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner

self.run()

File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 477, in run

self.__target(*self.__args, **self.__kwargs)

--- ---

File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/python/threadpool.py", line 210, in _worker

result = context.call(ctx, function, *args, **kwargs)

File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/python/context.py", line 59, in callWithContext

return self.currentContext().callWithContext(ctx, func, *args, **kw)

File "/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/twisted/python/context.py", line 37, in callWithContext

return func(*args,**kw)

exceptions.TypeError: 'str' object is not callable

这是我的代码:from twisted.web import server, resource

from twisted.internet import reactor, threads

import json

import time

connectedClients = {}

responseCollector = {}

# add fake data to the collector

class FakeData(resource.Resource):

isLeaf = True

def render_GET(self, request):

request.setHeader("content-type", "application/json")

if 'rid' in request.args and 'data' in request.args:

rid = request.args['rid'][0]

data = request.args['data'][0]

responseCollector[str(rid)] = data

return json.dumps(responseCollector)

return "{}"

class RequestHandler(resource.Resource):

isLeaf = True

def render_GET(self, request):

#request.setHeader("content-type", "application/json")

if not ('rid' in request.args and and 'json' in request.args):

return '{"success":"false","response":"invalid request"}'

rid = request.args['rid'][0]

json = request.args['id'][0]

# TODO: Wait for data to show up in the responseCollector with same rid

# as our request without blocking other requests OR timeout

d = threads.deferToThread(self.blockingMethod(rid))

d.addCallback(self.ret)

d.addErrback(self.err)

def blockingMethod(self,rid):

timeout = 5.0

timeElapsed = 0.0

while timeElapsed

if rid in responseCollector:

return responseCollector[rid]

else:

timeElapsed+=0.01

time.sleep(0.01)

return "timeout"

def ret(self, hdata):

return hdata

def err(self, failure):

return failure

reactor.listenTCP(8080, server.Site(RequestHandler()))

reactor.listenTCP(9080, server.Site(FakeData()))

reactor.run()

发出请求(当前不返回任何有用的内容):http://localhost:8080/?rid=1234&json={%22foo%22:%22bar%22}

添加一些假数据以用于请求:http://localhost:9080/?rid=1234&data=foo

使用工作版本更新from twisted.web import server, resource

from twisted.internet import reactor, threads

import json

import time

connectedClients = {}

responseCollector = {}

# add fake data to the collector

class FakeData(resource.Resource):

isLeaf = True

def render_GET(self, request):

request.setHeader("content-type", "application/json")

if 'rid' in request.args and 'data' in request.args:

rid = request.args['rid'][0]

data = request.args['data'][0]

responseCollector[str(rid)] = data

return json.dumps(responseCollector)

return "{}"

class RequestHandler(resource.Resource):

isLeaf = True

def render_GET(self, request):

if not ('rid' in request.args and 'data' in request.args):

return '{"success":"false","response":"invalid request"}'

rid = request.args['rid'][0]

json = request.args['data'][0]

# TODO: Wait for data to show up in the responseCollector with same rid

# as our request without blocking other requests OR timeout

d = threads.deferToThread(self.blockingMethod,rid)

d.addCallback(self.ret, request)

d.addErrback(self.err)

return server.NOT_DONE_YET

def blockingMethod(self,rid):

timeout = 5.0

timeElapsed = 0.0

while timeElapsed

if rid in responseCollector:

return responseCollector[rid]

else:

timeElapsed+=0.01

time.sleep(0.01)

return "timeout"

def ret(self, result, request):

request.write(result)

request.finish()

def err(self, failure):

return failure

reactor.listenTCP(8080, server.Site(RequestHandler()))

reactor.listenTCP(9080, server.Site(FakeData()))

reactor.run()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值