类型错误("无法pickle '_io.BufferedReader'对象")

5

我刚接触多进程编程,正在尝试编写一个程序,在谷歌上查找给定搜索词的前10个结果。在这个例子中,我只想同时运行两个搜索任务。以下是我的代码:

import threading
from multiprocessing.pool import Pool
import pycountry
import bs4
import requests
from googlesearch import search

def getGoogleResults(query):
    links = []
    # from geeks4geeks
    print("Getting google results...")
    for j in search(query, tld="co.in", num=10, stop=10, pause=2):
        links.append(j)
    print("Got google results!")
    return links

global queryResults
queryResults = {}

queries = ["stackoverflow", "github"]

if __name__ == "__main__":
    with Pool(2) as p:
            p.map(getGoogleResults, queries)

然而,当我运行它时,出现以下错误:
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/pool.py", line 771, in get
    raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '<multiprocessing.pool.ExceptionWithTraceback object at 0x101b23820>'. Reason: 'TypeError("cannot pickle '_io.BufferedReader' object")'

我找不到任何解决这个问题的地方。非常感谢您的帮助!

我已经大致确定问题出在 .append 部分,但是我不知道该如何修复它。有很多关于此问题的文章,但没有答案。


无论 j 是什么,都不能被 pickled 并发送回主进程。那么 j 是什么? - Aaron
1
@Aaron j 是字符串类型。然而,经过进一步测试,我相信我已经缩小了问题范围:在测试中,我将查询设置为一个非常长的相同字符串列表,导致HTTP请求错误,这显然无法被pickle化。如果你没有提出这个问题,我甚至不会回头看。非常感谢! - NYT
1个回答

4

希望不是太晚了。我在尝试使用多进程池进行映射时遇到了相同的错误。我所做的是切换到ThreadPoolExecutor,与多进程池的使用方式相同。

from concurrent import futures

with futures.ThreadPoolExecutor(10) as executor:
    hocr_data = executor.map(convert_pdf_to_hocr, image_pdf_pages)

试一试吧。


非常被低估的评论!你救了我的命! - Shaun Han
对我来说很有效!!! - ValiSpaceProgramming
它运作得很好。我们不需要其他库来做这个,非常简单。 - namhnz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接