Python 使用Pool.map()多线程处理PhantomJS类型错误
我的代码打印出错误类型错误:执行时无法序列化'\u io.TextIOWrapper'对象。 我的目标是使用selenium并行化Ajax刮取,因为我不太知道如何直接刮取Ajax调用。 我的最终目标是用URL列表取代数字列表a=[1,2,3,4],a=['url1','url2',…] 用于屏幕抓取。(这只是“原型”代码)。 我将感谢您对解决方案的简单但准确的解释,因为我不太擅长编程。谢谢`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
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)'行引起了这个错误。:谢谢。让每个进程实例化自己的驱动程序更有意义!!哦,你已经为我需要做的研究开辟了道路。