将非阻塞阅读的结果存储到列表中

时间:2018-03-13 19:01:08

标签: python python-2.7 twisted

这是对我之前帖子的修改。基于此answer,我将以下内容用于非阻塞读写方法(使用Python 2.7):

from __future__ import print_function
from twisted.internet.task import react
from twisted.internet.defer import Deferred
from twisted.internet.fdesc import readFromFD, setNonBlocking

def getFile(filename):
    with open(filename) as f:
        d = Deferred()
        fd = f.fileno()
        setNonBlocking(fd)
        readFromFD(fd, d.callback)
        return d

def main(reactor, filename):
    d = getFile(filename)
    return d.addCallback(print)

react(main, ['/Users/USER1/Desktop/testfile.txt'])

事实上,我想将阅读结果存储到列表中,而不是在print中使用return d.addCallback(print)。我尝试了以下方法:

def main(reactor, filename):
    d = getFile(filename)
    X = []
    return d.addCallback(X)

但似乎不正确。如何将阅读结果存储到列表中?

1 个答案:

答案 0 :(得分:0)

由于X[],您将添加一个空列表作为回调。但是,空列表不可调用,因此无法用作回调。

相反,你想要像X.append这样的东西。 X.append是可调用的(并且带有一个参数)。所以它可以回复。

return d.addCallback(X.append)

但是,X.append会返回None,因此在d运行后,None的结果会变为X.append。然后,您的示例中的任何代码都无法访问X,因此这可能不是最有用的事情。