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

多进程共享全局变量:插入大量数据后字典仍为空

问题根源

你用multiprocessing.Pool时犯了一个典型错误:进程间内存不共享。每个子进程会复制一份当前的类实例(包括self.news字典),子进程里对self.news的修改只在自己的进程内存里生效,主进程的self.news完全没被修改,所以最后导出的JSON是空的。

修复方案

最稳妥的方式是让每个子进程返回处理后的新闻片段,主进程再把所有片段合并到总字典里,具体修改如下:

修改handler函数

不再直接修改self.news,而是返回当前文件处理后的子字典:

def handler(self, file):
    news_chunk = {}
    articles = self.open_text_file(self.path + file)
    for n in articles:
        try:
            image_url = self.investing.extract_image(n)
            url, title = self.investing.extract_title(n)
            id = url.split('-')[-1]
            text = self.investing.extract_text(n)

            news_chunk[id] = {
                'url': self.base_url + url,
                'image': image_url,
                'title': title,
                'text': text
            }
        except KeyError:
            pass
    return news_chunk

(注:原代码里先提取id又被url.split('-')[-1]覆盖,那行冗余代码可以直接删掉)

修改extract_info函数

收集所有子进程返回的结果,合并到主进程的self.news:

def extract_info(self):
    task = self.create_tasks()
    self.news = {}
    with Pool(CPU_COUNT) as pool:
        # 用map收集所有子进程返回的字典片段
        results = pool.map(self.handler, task)
    
    # 合并所有片段到总字典
    for chunk in results:
        self.news.update(chunk)

    # 用'w'模式覆盖写入,避免多次运行导致JSON格式错误
    with open('financial_news.json', 'w', encoding='utf8') as file:
        json.dump(self.news, file, indent=4)
额外排查点

如果修改后还是没有数据,需要检查:

  • create_tasks()返回的文件列表是否正确,有没有实际文件被处理
  • open_text_file()是否正确读取并返回可迭代的articles对象
  • 各个extract_*方法是否正常工作,比如是否因为其他异常(不是KeyError)导致数据没被提取,可以把except KeyError改成except Exception as e并打印错误信息,排查具体问题

内容的提问来源于stack exchange,提问作者Bruno Finger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:45