2016-02-09 3 views
0

Я недавно прочитал официальные документы о скрученной каркасе 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 секунды, что я могу сделать. Ваш ответ будет высоко оценен.

+1

Я не осведомлен о витой вообще, но я бы предположил (основываясь на опыте с другими фреймворками), что * ничего не происходит внутри рамки до тех пор, пока линия 'реактор.run' в конце не выйдет из своего внутреннего события петля. Если ваш другой код (вызов 'deferToThread', печать« не блокировка »и т. Д.) Выполнялся в обратном вызове из Twisted code, я подозреваю, что он будет работать так, как вы ожидали. – Blckknght

ответ

1

Ваш код проходит через два sleep(3). Один перед тем, как вы начнете работать в реакторе и запустите его. Другой - в функции delay.

Теперь после ожидания в первый раз, реактор запускается. Это тот момент, когда поток действительно начинается. Примерно через 3 с он вернется и результат будет напечатан. Должно брать чуть больше 6 с.

Вкратце: скрученный ничего не делает до запуска реактора.

+0

Большое спасибо. Я думаю, мне следует избегать написания кода, например time.sleep (3) в моем основном коде. –

+0

Вам следует избегать блокировки вызовов вообще. Вместо этого используйте 'reactor.callLater (3, your_function, args ...)'. Он будет стоять в очереди 'your_function (args ...)' для запуска через 3 секунды и продолжить немедленно. –

Смежные вопросы