Я недавно прочитал официальные документы о скрученной каркасе python. Теперь я могу четко понимать, что «Отложенные действия не делают: сделайте свой асинхронный код». Когда вы вызываете функцию блокировки, вам нужна функция «Twisted.internet.threads.deferToThread», чтобы настроить поток для запуска блокировки функции.python twisted: отложенная функция не запускается немедленно?
Я wrtite следующую демонстрацию, чтобы сделать тест:
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()
Но результат я получил из моего expection:
(myspace) [[email protected] 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 секунды задержки после вывода второй line («теперь, чтобы получить результат задержки fuction») вместо вывода третьей строки. Я не знаю, почему мой код спящий 6 секунд, не должно ли оно быть 3 секунды? Если это должно быть 6, то это означает, что «отложенный только отсрочил блокировку, не запускает функцию сразу после d .addCallback (getres) "? , если я хочу только задержка на 3 секунды, что я могу сделать. Ваш ответ будет высоко оценен.
Я не осведомлен о витой вообще, но я бы предположил (основываясь на опыте с другими фреймворками), что * ничего не происходит внутри рамки до тех пор, пока линия 'реактор.run' в конце не выйдет из своего внутреннего события петля. Если ваш другой код (вызов 'deferToThread', печать« не блокировка »и т. Д.) Выполнялся в обратном вызове из Twisted code, я подозреваю, что он будет работать так, как вы ожидали. – Blckknght