gpt4 book ai didi

python - Twisted 非阻塞方法 - 怎么做?

转载 作者:行者123 更新时间:2023-11-28 23:02:53 25 4
gpt4 key购买 nike

我的代码是这样的:

... # 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 - Twisted 非阻塞方法 - 怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9310350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com