我正在尝试解析包含汽车属性的网站(154种属性)。我有一个巨大的列表(名称是 liste_test ),包含280.000二手车公告网址。
def araba_cekici(liste_test,headers,engine):
for link in liste_test:
try:
page = requests.get(link, headers=headers)
.....
.....
当我开始这样的代码时:
araba_cekici(liste_test,headers,engine)
它起作用并获得结果。但大约在1小时内,我只能获得1500个URL的属性。它非常慢,我必须使用多处理。
我在here上找到了一个带有多重处理的结果。然后我申请了我的代码,但不幸的是,它没有用。
import numpy as np
import multiprocessing as multi
def chunks(n, page_list):
"""Splits the list into n chunks"""
return np.array_split(page_list,n)
cpus = multi.cpu_count()
workers = []
page_bins = chunks(cpus, liste_test)
for cpu in range(cpus):
sys.stdout.write("CPU " + str(cpu) + "\n")
# Process that will send corresponding list of pages
# to the function perform_extraction
worker = multi.Process(name=str(cpu),
target=araba_cekici,
args=(page_bins[cpu],headers,engine))
worker.start()
workers.append(worker)
for worker in workers:
worker.join()
它给出了:
TypeError: can't pickle _thread.RLock objects
我发现了一些与此错误有关的回复。但它们都不起作用(至少我不适用于我的代码)。 此外,我尝试了python多进程Pool,但不幸的是它停留在 jupyter notebook 上,似乎这段代码无限运行。
答案 0 :(得分:0)
最新答案,但由于在Google上搜索时出现此问题:multiprocessing
通过multiprocessing.Queue
将数据发送到辅助进程,要求发送的所有数据/对象均为{{3} }。
在您的代码中,您尝试传递未显示其实现的header
和engine
。 (由于header
拥有HTTP请求标头,因此我怀疑这里是engine
。)要解决您的问题,您必须使engine
可腌,或者仅实例化{{1 }}在工作进程中。