多进程共享全局变量:插入大量数据后字典仍为空
问题根源
你用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
相关产品推荐
相关产品推荐

