扭曲非阻塞方法 - 如何?

时间:2012-02-16 11:18:12

标签: python twisted twisted.web twisted.internet

我的代码如下所示:

... # 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秒钟。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

你做错了是运行阻塞调用(time.sleep(2)),而Twisted希望你只执行非阻塞操作。不等的东西。因为那里有time.sleep(2),所以Twisted在该函数休眠时无法执行任何其他操作。因此它也无法向浏览器发送任何数据。

对于time.sleep(2),您可以将其替换为另一个reactor.callLater来电。假设您实际上意味着time.sleep(2)调用是一些其他阻塞操作,如何修复它取决于操作。如果您可以以非阻塞方式执行操作,请执行此操作。对于许多此类操作(如数据库交互),Twisted已经提供了非阻塞替代方案。如果你正在做的事情没有非阻塞接口而且Twisted没有替代它,你可能必须在一个单独的线程中运行代码(例如使用twisted.internet.threads.deferToThread),尽管这需要你的代码实际上是线程安全的。