gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:34:31 24 4
gpt4 key购买 nike

我正在玩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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com