将非阻塞读取的结果存储到列表中
Storing the results of non-blocking reading into a list
这是我之前post的修改。基于这个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'])
其实我想把阅读结果存入一个列表,而不是在return d.addCallback(print)
中使用print
。我尝试了以下方法:
def main(reactor, filename):
d = getFile(filename)
X = []
return d.addCallback(X)
不过好像不太对。如何将阅读结果存储到列表中?
由于 X
是 []
,您要添加一个空列表作为回调。但是,空列表不可调用,因此不能用作回调。
相反,您需要 X.append
之类的东西。 X.append
是可调用的(并且有一个参数)。所以它做了一个很好的回调。
return d.addCallback(X.append)
但是,X.append
returns None
所以 d
的结果在 X.append
有 运行 之后变成了 None
。 X
然后您的示例中的任何代码都无法访问,因此这可能不是最有用的事情。
这是我之前post的修改。基于这个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'])
其实我想把阅读结果存入一个列表,而不是在return d.addCallback(print)
中使用print
。我尝试了以下方法:
def main(reactor, filename):
d = getFile(filename)
X = []
return d.addCallback(X)
不过好像不太对。如何将阅读结果存储到列表中?
由于 X
是 []
,您要添加一个空列表作为回调。但是,空列表不可调用,因此不能用作回调。
相反,您需要 X.append
之类的东西。 X.append
是可调用的(并且有一个参数)。所以它做了一个很好的回调。
return d.addCallback(X.append)
但是,X.append
returns None
所以 d
的结果在 X.append
有 运行 之后变成了 None
。 X
然后您的示例中的任何代码都无法访问,因此这可能不是最有用的事情。