【问题标题】:python twisted: Deferred function not run immediately?python twisted:延迟函数不会立即运行?
【发布时间】:2016-02-09 23:54:45
【问题描述】:

我最近阅读了有关 python 扭曲框架的官方文档。 现在,我可以清楚地理解“延迟不做的事情:让你的代码异步”,当你调用阻塞函数时,你需要“twisted.internet.threads.deferToThread”函数来设置一个线程来运行阻塞函数.

我写了下面的demo来做一个测试:

from twisted.internet import reactor,defer,threads
import time
def delay(x):
    time.sleep(x)
    return "Time to wake up,you havs sleep %s second!" % x

def getres(res):
    print res
    reactor.stop()

d = threads.deferToThread(delay,3)
d.addCallback(getres)
print "Now my pieces of code not blocking!"

import time
time.sleep(3)
print "now to get the result of the delayed fuction"
reactor.run()

但得到的结果却出乎我的意料:

(myspace) [root@master myspace]# python ttt.py 
Now my pieces of code not blocking!
now to get the result of the delayed fuction
Time to wake up,you havs sleep 3 second!

为什么输出第二行(“现在得到延迟函数的结果”)后仍然有 3 秒延迟,而不是立即输出第三行。 我不知道为什么我的代码总共睡眠 6 秒,不是必须是 3 秒吗?如果必须是 6,是不是说“延迟只是延迟了阻塞功能,而不是在 d 之后立即运行该功能。添加回调(getres)”? 如果我只想延迟 3 秒,我该怎么办。 您的回答将不胜感激。

【问题讨论】:

  • 我对 Twisted 完全不了解,但我猜(根据对其他框架的经验)在 reactor.run 行之前,框架内什么都没有发生最后启动其内部事件循环。如果您的其他代码(调用 deferToThread、打印“不阻塞”等)在 Twisted 代码的回调中运行,我怀疑它会按您期望的方式工作。

标签: python twisted deferred


【解决方案1】:

您的代码通过两个sleep(3)。甚至在你启动反应堆并让 Twisted 运行之前。另一个在delay 函数中。

现在第一次等待 3 秒后,反应堆开始启动。这也是线程实际开始的地方。大约 3 秒后它返回并打印结果。总共需要超过 6 秒。

或者简而言之:Twisted 在反应堆运行之前不做任何事情。

【讨论】:

  • 非常感谢。我认为我应该避免在我的主代码中编写类似 time.sleep(3) 的代码。
  • 您应该完全避免阻塞呼叫。请改用reactor.callLater(3, your_function, args...)。它将排队 your_function(args...) 在 3 秒内运行并立即继续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
相关资源
最近更新 更多