from __future__ import print_function
from twisted.internet import reactor, threads
import time
def printResult(x):
def _callback(response):
print('Number %s' %x)
print('Result %s' % response)
print('--------------------------')
return _callback
def doLongCalculation(z):
s = 0
for i in xrange(z):
s += i
return s
for i in xrange(100000):
d = threads.deferToThread(doLongCalculation, z=i)
d.addCallback(printResult(i))
reactor.run()
请你强调一下方式 addCallback(printResult(i))
是叫什么名字?
我知道按照医生的说法应该是 addCallback(printResult, i)
和printResult应定义如下
def printResult(response, x):
print('Number %s' %x)
print('Result %s' % response)
print('--------------------------')
for i in xrange(100000):
d = threads.deferToThread(doLongCalculation, z=i)
d.addCallback(printResult(i))
是与:
for i in xrange(100000):
d = threads.deferToThread(doLongCalculation, z=i)
_callback = printResult(i)
d.addCallback(_callback)
_callback
是一个定义在 和 所回 printResult
就是说 _callback
可以引用定义在 printResult
. 在这种情况下,提到的是 i
传给 printResult(i)
,因为你正在打印 x
在 _callback
.当递延 d
被解雇(通过调用 d.callback(result)
)Twisted将开始解析回调链。_callback
是第一个,然后 _callback(result)
将被调用。因为数字是不可改变的,所以变量 x
定义于 printResult
作为一个参数不会改变,我们可以更清楚地看到闭包函数的工作原理。如果我调用 printResult(5)
, x
= 5,我将有一个 新的 封闭函数定义为。
def _callback(response):
print('Number %s' % 5) # replaced x by 5
print('Result %s' % response)
print('--------------------------')
return _callback
请注意,在实际的代码中不会发生替换, 如果对象被 x
变化(即它是可变的),第一种是 print
在 _callback
也会改变。以 printResult(response, x)
,上面关于闭合函数的例子将等同于。
d.addCallback(printResult, 5)
你也知道,twisted会这样调用它 printResult(result, 5)