扭曲的非阻滞方法 - 如何?
-
26-10-2019 - |
题
我的代码看起来像这样:
... # class Site(Resource)
def render_POST(self,request)
otherclass.doAssync(request.args)
print '1'
return "done" #that returns the HTTP response, always the same.
...
def doAssync(self,msg):
d = defer.Deferred()
reactor.callLater(0,self.doStuff,d,msg)
d.addCallback(self.sucess)
def doStuff(self,d,msg):
# do some stuff
time.sleep(2) #just for example
d.callback('ok')
def sucess(msg):
print msg
输出:
1
好的
到目前为止,一切都很好,但是,HTTP响应(返回“完成”),只有在延迟之后发生(Time.sleep(2))。我可以说,因为浏览器保持“加载” 2秒钟。
我究竟做错了什么?
解决方案
您做错了什么是运行阻止电话(time.sleep(2)
),尽管扭曲期望您只执行非阻滞操作。不等待的事情。因为你有那个 time.sleep(2)
在那里,扭曲在该功能睡觉时无能为力。因此,它也不能向浏览器发送任何数据。
如果是 time.sleep(2)
, ,您将用另一个代替 reactor.callLater
称呼。假设您实际上是为了 time.sleep(2)
致电以成为其他阻止操作,如何修复它取决于操作。如果您可以以非阻滞方式进行操作,请执行此操作。对于许多这样的操作(例如数据库互动),扭曲的替代方案已经带来了非阻滞替代方案。如果您正在做的事情没有非阻滞界面,并且扭曲没有替代方案,则可能必须在单独的线程中运行代码(例如使用 twisted.internet.threads.deferToThread
),尽管需要您的代码实际上是线程安全。
不隶属于 StackOverflow