Python3不能通过多处理来挑选列表上的_thread.RLock对象

时间:2018-05-17 12:46:23

标签: python python-multiprocessing

我正在尝试解析包含汽车属性的网站(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 上,似乎这段代码无限运行。

1 个答案:

答案 0 :(得分:0)

最新答案,但由于在Google上搜索时出现此问题:multiprocessing通过multiprocessing.Queue将数据发送到辅助进程,要求发送的所有数据/对象均为{{3} }。

在您的代码中,您尝试传递未显示其实现的headerengine。 (由于header拥有HTTP请求标头,因此我怀疑这里是engine。)要解决您的问题,您必须使engine可腌,或者仅实例化{{1 }}在工作进程中。