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

Orh*_*lak 9 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)
        .....
        .....
Run Code Online (Sandbox Code Playgroud)

当我开始这样的代码时:

araba_cekici(liste_test,headers,engine)
Run Code Online (Sandbox Code Playgroud)

它起作用并获得结果.但大约在1小时内,我只能获得1500个URL的属性.它非常慢,我必须使用多处理.

我在这里找到了一个带有多处理的结果.然后我申请了我的代码,但不幸的是,它没有用.

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()
Run Code Online (Sandbox Code Playgroud)

它给出了:

TypeError: can't pickle _thread.RLock objects
Run Code Online (Sandbox Code Playgroud)

我发现了一些与此错误有关的回复.但它们都不起作用(至少我不能应用于我的代码).此外,我尝试了python多进程池,但不幸的是它停留在jupyter笔记本上,似乎这个代码无限运行.

Ion*_*ons 3

迟到的答案,但由于在 Google 上搜索时出现了这个问题:multiprocessing通过 a 将数据发送到工作进程multiprocessing.Queue,这要求发送的所有数据/对象都是可挑选的

在您的代码中,您尝试传递headerand engine,但您没有显示其实现。(由于header保存了 HTTP 请求标头,我怀疑这engine就是问题所在。)要解决您的问题,您要么必须进行enginepicklable,要么只engine在工作进程中实例化。