Python 使用Pool.map()多线程处理PhantomJS类型错误

Python 使用Pool.map()多线程处理PhantomJS类型错误,python,multiprocessing,Python,Multiprocessing,我的代码打印出错误类型错误:执行时无法序列化'\u io.TextIOWrapper'对象。 我的目标是使用selenium并行化Ajax刮取,因为我不太知道如何直接刮取Ajax调用。 我的最终目标是用URL列表取代数字列表a=[1,2,3,4],a=['url1','url2',…] 用于屏幕抓取。(这只是“原型”代码)。 我将感谢您对解决方案的简单但准确的解释,因为我不太擅长编程。谢谢` from multiprocessing import Pool from selenium impor

我的代码打印出错误类型错误:执行时无法序列化'\u io.TextIOWrapper'对象。 我的目标是使用selenium并行化Ajax刮取,因为我不太知道如何直接刮取Ajax调用。 我的最终目标是用URL列表取代数字列表a=[1,2,3,4]a=['url1','url2',…] 用于屏幕抓取。(这只是“原型”代码)。 我将感谢您对解决方案的简单但准确的解释,因为我不太擅长编程。谢谢`

from multiprocessing import Pool
from selenium import webdriver

def func(x):
    y=x[0]
    return y*y


if __name__=='__main__':
    a=[1,2,3,4]
    drivers=[webdriver.PhantomJS() for x in range(4)]
    c=zip(a,drivers)
    p=Pool(4)
    results=p.map(func,c)
    p.close()
    for result in results:
        print(result)

在不了解任何关于
selenium
webdriver
的信息的情况下,很明显,它会打开一个
TextIOWrapper
对象。确切的原因,我不知道,但它可能是一个包装文件索引或套接字。问题是无法序列化此对象并在不同进程之间传递

在当前情况下,最简单的解决方案是让每个进程实例化自己的
驱动程序
,只需传递indata并将结果返回给主进程:

from multiprocessing import Pool
from selenium import webdriver

def func(x):
    driver = webdriver.PhantomJS() # To be used in current function (process)
    y = x
    return y*y

if __name__ == '__main__':
    a = [1,2,3,4]
    p = Pool(4)
    results = p.map(func, a)
    p.close()
    for result in results:
        print(result)

请注意,我想,如果您想让
驱动程序保持活动状态以供以后执行更多操作,那么这是行不通的。在这种情况下,您需要一个更详细的方案,在该方案中,您可以提前设置流程(在创建
池时使用
初始值设定项
参数)。

您使用的是多处理。它不同于多线程。线程共享内存,进程不共享。对于纯python并行程序,由于全局解释器锁(GIL),您希望使用多处理。不知道selenium,我不知道为什么会出现这个错误,但是你能告诉我们是哪一行引起的,是
zip()
还是
map()
?@Mathieu:'results=p.map(func,c)'行引起了这个错误。:谢谢。让每个进程实例化自己的驱动程序更有意义!!哦,你已经为我需要做的研究开辟了道路。