扭曲的deferToThread addCallback调用。

问题描述 投票:0回答:1
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('--------------------------')
python twisted
1个回答
0
投票
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)

© www.soinside.com 2019 - 2024. All rights reserved.