python - 扭曲的非阻塞方法——如何实现?

标签 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

ok

到目前为止,一切顺利,但是,HTTP 响应(返回“完成”)仅在延迟 (time.sleep(2)) 之后发生。 我可以这么说,因为浏览器会持续“加载”2 秒。

我做错了什么?

最佳答案

您做错的地方是运行阻塞调用 (time.sleep(2)),而 Twisted 希望您仅执行非阻塞操作。那些不等的事情。因为其中有 time.sleep(2),所以当该函数处于休眠状态时,Twisted 无法执行任何其他操作。因此它也无法向浏览器发送任何数据。

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

关于python - 扭曲的非阻塞方法——如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9310350/

相关文章:

python - 虚拟环境中的 0MQ

python - cv2将c++的Range和copyTo函数转换为python

python - 为什么 Regex finditer 只返回第一个结果

python - 如何用py2exe打包Twisted程序?

python - twistd 可以像 django 一样自动重置服务器吗?

python - 如何在计划任务的情况下从 celery 获取任务 ID (beat)

python - twistd 和 nohup & : what is the difference?

twisted - 相当于twisted.web.template 的nevow.tags.raw

python - 为什么我的 HTTP POST 请求数据字符串(可能)被错误编码?

Python Twisted 框架 HTTP 客户端