【问题标题】:Parallel Processing in python to fill a dictionary with the value as a dictionary(nested)python中的并行处理以将值填充为字典(嵌套)
【发布时间】:2020-09-19 16:04:53
【问题描述】:

我在 CSV 文件中有多个链接(URL),我想使用这些 URL 来提取/抓取数据并将其以字典格式存储。

为了方便这一点,我开发了一个函数,它将 URL 作为输入并返回一个字典作为输出。

例如:

def site_details(URL):

    site_dict = {}
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')
    site_dict['Date_created'] = soup.find('div', attrs={"class":"date" })
    site_dict['visits'] = soup.find('div', attrs={"class":"visits" })
    return(site_dict)

现在我想并行处理所有 URL 并将它们存储在另一个字典中,以后可以将其转换为 CSV 文件。

到目前为止,我已经尝试了以下方法:

from multiprocess import Process, Manager
def f(d, x):
    d[x] = site_details(df["Subject_link"][x])
    return d

manager = Manager()
d = manager.dict()
job = [Process(target=f, args=(d, i)) for i in range(5)]

_ = [p.start() for p in job]
_ = [p.join() for p in job]
print(d)

问题是我得到一个空列表

我想要这样的输出:

d = {
      1:{date_created : '22/1/2014',visits:490}
      2:{date_created : '23/1/2014',visits:480}
      3:{date_created : '24/1/2014',visits:470}
    }

感谢您的帮助!

【问题讨论】:

    标签: python dictionary parallel-processing multiprocessing python-multiprocessing


    【解决方案1】:

    此代码使用 multiprocessing 模块按预期工作。
    这段代码,使用来自 Mike McKearns 的 multiprocess 应该也是。

    不工作?

    a) 检查 dill 模块是否存在,这是multiprocess 工作的先决条件。

    b) 重新运行下面的代码。

    c) 根据需要调整此工作模板,但不要返回任何值,而是将其存储到由 Manager 管理的实例变量中strong>-instance,最好通过with Manager as myNewContextManagerForThisLimitedScopeOfUse: 子句将Manager 用作上下文管理器

    from multiprocessing import Process, Manager                            # https://stackoverflow.com/questions/62130801/parallel-processing-in-python-to-fill-a-dictionary-with-the-value-as-a-dictionar
    import os
    
    def f( d, l, i ):
        d[0]    = '1'
        d['2']  =  2
        d[0.25] = None
        d[1] = { "date_created": '22/1/2014', "visits": 490, "os.getpid()": os.getpid() }
        d[2] = { "date_created": '23/1/2014', "visits": 480, "os.getpid()": os.getpid() }
        d[3] = { "date_created": '24/1/2014', "visits": 470, "os.getpid()": os.getpid() }
        d[99 + 100 * ( i + 1 )] = os.getpid()
        l.reverse()
    
    if __name__ == '__main__':
        print( "The __main__ in PID::", os.getpid() )
        with Manager() as myDemoMANAGER:
            d = myDemoMANAGER.dict()
            l = myDemoMANAGER.list( range( 10 ) )
    
            # p = Process( target = f, args = ( d, l ) )
            # 
            # p.start()
            # p.join()
    
            jobs = [ Process( target = f, args = ( d, l, i ) ) for i in range( 5 ) ]
            _    = [ p.start() for p in jobs ]
            _    = [ p.join()  for p in jobs ]
    
    
            print( "The dict instance is: ", d )
            print( "The list instance is: ", l )
            print( "\nQ.E.D." )
    
    '''
    (py3) Tue Jun 02 13:49:27 $ python StackOverflow_py3_Multiprocess.py
    
    The __main__ in PID:: 19595
    The dict instance is:  { 0: '1',
                             0.25: None,
                             1: { 'date_created': '22/1/2014', 'visits': 490, 'os.getpid()': 19610 },
                             2: { 'date_created': '23/1/2014', 'visits': 480, 'os.getpid()': 19607 },
                             3: { 'date_created': '24/1/2014', 'visits': 470, 'os.getpid()': 19607 },
                             199: 19604,
                             299: 19605,
                             399: 19607,
                             499: 19609,
                             599: 19610,
                            '2': 2
                             }
    The list instance is:  [ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ]
    
    Q.E.D.
    
    '''
    

    关于修改托管对象内部细节的小评论:

    文档明确警告要修改 v/s 分配 v/s 重新分配托管引用:

    如果标准(非代理)listdict 对象包含在所指对象中,则对这些可变值的修改将不会通过 manager 传播,因为代理没有办法知道其中包含的值何时被修改。但是,将值存储在容器代理中(触发代理对象上的 __setitem__)确实会通过 manager 传播,因此要有效地修改此类项目,可以重新分配修改容器代理的值

    【讨论】:

    • 感谢朋友的帮助!我弄清楚我最初的问题是什么。当我在 Windows 环境中运行代码时,代码不起作用,但是当我使用 Linux env(在 Windows 上使用 VM)时,它可以正常工作。你知道它为什么会发生吗,我在网上查看不同的答案,但找不到它
    • 当然,默认(不适用于Win类的O/S-es)multiprocessing-“后端”引擎{ spawn | loky | ... }存在巨大差异。不要犹豫,阅读文档以了解有关其系统属性的所有相关详细信息以及它们对使用 multiprocessing 进程的意义。
    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2020-06-08
    • 2016-11-18
    • 2017-08-31
    • 2018-01-20
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多