You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:21:10