如何在Python 2.7中将非阻塞读取结果存入列表?
嘿,我懂你的需求——你想把Python 2.7里异步非阻塞读取的结果存到列表里,而不是用d.addCallback(print)直接打印出来对吧?其实调整起来很简单,核心就是把回调函数从打印改成往列表里追加内容,下面给你几种可行的实现方式:
方法1:自定义回调函数存储结果(基础版)
如果你的代码是基于Twisted的Deferred(从你提到d.addCallback来看应该是),可以先初始化一个列表,然后写一个专门的回调函数把结果加进去:
from twisted.internet import reactor from twisted.web.client import getPage # 初始化用来存结果的列表 results = [] def save_to_list(result): # 把异步读取到的结果追加到列表 results.append(result) print(f"已存入1条结果,当前列表共{len(results)}条") # 发起异步读取请求 d = getPage("http://example.com") d.addCallback(save_to_list) # 如果有多个请求,重复上面的步骤就行 d2 = getPage("http://google.com") d2.addCallback(save_to_list) # 等所有请求完成后再处理列表 def handle_all_done(_): print("\n所有读取任务完成!") print("最终结果列表:") for idx, content in enumerate(results): # 只打印前50个字符避免输出太长 print(f"第{idx+1}条: {content[:50]}...") reactor.stop() # 用DeferredList等待所有异步任务结束 from twisted.internet.defer import DeferredList DeferredList([d, d2]).addCallback(handle_all_done) reactor.run()
方法2:用类封装(更规范的写法)
如果是在项目里使用,建议用类来封装结果列表,避免全局变量的问题:
from twisted.internet import reactor from twisted.web.client import getPage from twisted.internet.defer import DeferredList class AsyncResultCollector: def __init__(self): self.results = [] def _save_result(self, result): self.results.append(result) print(f"已添加结果,当前列表长度: {len(self.results)}") def process_final_results(self, _): print("\n所有任务完成,开始处理结果:") for res in self.results: print(res[:50]) reactor.stop() # 创建收集器实例 collector = AsyncResultCollector() # 绑定回调到收集器的方法 d1 = getPage("http://example.com") d1.addCallback(collector._save_result) d2 = getPage("github.com") d2.addCallback(collector._save_result) # 等待所有任务完成后处理列表 DeferredList([d1, d2]).addCallback(collector.process_final_results) reactor.run()
方法3:用inlineCallbacks简化异步流程(更直观)
Twisted的inlineCallbacks装饰器可以让你用同步的写法写异步代码,直接在生成器里把结果加到列表:
from twisted.internet import reactor from twisted.web.client import getPage from twisted.internet.defer import inlineCallbacks results = [] @inlineCallbacks def fetch_and_store(): # 逐个等待异步请求完成,然后存到列表 page_content1 = yield getPage("http://example.com") results.append(page_content1) page_content2 = yield getPage("http://google.com") results.append(page_content2) # 所有请求完成后处理列表 print("\n所有页面获取完成!") print(f"结果列表共{len(results)}条内容") reactor.stop() fetch_and_store() reactor.run()
注意事项:
- 异步操作是非阻塞的,不要在reactor运行期间直接去读取列表,因为可能结果还没被存入。一定要等所有异步任务完成后再处理列表(比如上面例子里的
handle_all_done或者process_final_results方法)。 - 如果你的非阻塞读写不是用Twisted,而是其他库(比如
select或者asyncore),核心思路也是一样的:定义一个列表,在读取完成的回调/处理函数里把结果追加进去。
内容的提问来源于stack exchange,提问作者Kristy
相关产品推荐
相关产品推荐

