python - 扭曲中的回调链错误地重复了最后一个回调

标签 python twisted

我正在玩twisted,我正在尝试创建一个简单的主服务器,它将单元测试列表分发给它的从服务器。以下代码有效,但我的输出很奇怪。从机不是执行 n 个测试中的每一个,而是执行最后一个单元测试 n 次。

我正在使用twisted的内置放大器协议(protocol)。相关代码如下:

class Master(object):

    def __init__(self):
        self.tests = [
            "test1",
            "tests2",
            ... etc
        ]

    def serve(self):
        self.factory = MasterFactory()
        reactor.listenTCP(1234, self.factory)
        d = threads.deferToThread(self.get_cmd)
        d.addCallback(lambda ign: self.run_test())
        print 'Serving on port 1234'

    def get_cmd(self):
        return raw_input('> ')

    def run_test(self):
        while True:
            for slave in self.factory.slaves.values():
                if self.tests == []:
                    break
                slave.tests.append(self.tests.pop(0))
            if self.tests == []:
                break

        for slave in self.factory.slaves.values():
            self.construct_list(slave)

    def construct_list(self, slave):
        d = defer.Deferred()
        for test in slave.tests:
            d.addCallback(lambda ign:
                slave.protocol.callRemote(commands.RunCmd, cmd="python setup.py trial -s " + test))
            d.addCallback(self.cmd_response)
        d.callback(None)

    def cmd_response(self, response):
        print response['output']
        return None


def main():
    m = Master()
    m.serve()
    reactor.run()

if __name__ == "__main__":
    main()

最佳答案

这是循环变量和闭包在 Python 中如何工作的常见问题。考虑这个例子:

>>> def f(n):
...     print n
... 
>>> fs = []
>>> for i in range(3):
...     fs.append(lambda: f(i))
... 
>>> fs[0]()
2
>>> fs[1]()
2
>>> fs[2]()
2
>>> 

关于python - 扭曲中的回调链错误地重复了最后一个回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049340/

相关文章:

python - 在字符级别对文本进行编码以输入 tensorflow 模型的最有效和高效的方法是什么?

python - 在 pandas 中,如何读取列中包含列表的 csv 文件?

python - 在扭曲中使用线程

Python Twisted - 如何通过已连接的套接字连接发送数据?

python - Twisted Python - 如何为证书选项创建可接受的密码列表?

python - RobuSTLy 使用 Git blame 检索 SHA 和行内容 (Python3)

python - 测试模拟是否与其他模拟一起调用

python - 使用 Twisted 同时记录和获取命令行输入

python - 监听多个扭曲端点

python - python 中的正则表达式