无法利用多处理共享内存来保存多处理功能的输出

Cannot utilise multiprocessing shared memory to save output from multiprocessing function

我正在编写一个程序来从 Web 中提取信息并将其保存在 Python 列表中。我使用多处理方法提取信息,但在保存输出列表以供进一步处理时遇到问题。这是我的代码:

import multiprocessing

def web_scrape1():
    #some codes to scrape the web output 3 lists
    global sub_list1a, sub_list2a, sub_list3a
    sub_list1a.append(scrape1)
    sub_list2a.append(scrape2)
    sub_list3a.append(scrape3)

def web_scrape2():
    #some codes to scrape the web output 3 lists
    global sub_list1b, sub_list2b, sub_list3b
    sub_list1b.append(scrape1)
    sub_list2b.append(scrape2)
    sub_list3b.append(scrape3)

def master_scraper():
    ws1 = multiprocessing.Process(target=web_scrape1)
    ws2 = multiprocessing.Process(target=web_scrape2)

    ws1.start()
    ws2.start()
    ws1.join()
    ws2.join()

    global master_list1, master_list2, master_list3

    master_list1 = sub_list1a + sub_list1b
    master_list2 = sub_list2a + sub_list2b
    master_list3 = sub_list3a + sub_list3b

def postprocessing():
    #some codes to process the lists
    print(master_list1) # Output []
    print(master_list2) # Output []
    print(master_list3) # Output []

def main():
  master_scraper()
  postprocessing()

if __name__ == '__main__':
  multiprocessing.freeze_support()
  main()

以上代码的输出很简单:

[]
[]
[]

我尝试在 web_scape1()master_scraper()main() 函数中使用类似 multiprocessing.Array('b', sub_list1a) 的方法将所有列表分配给共享内存,但列表仍然存在回到 [].

希望在这里得到一些帮助。

multiprocessing中不能使用全局变量,因为进程拥有自己的内存区域,每个进程内部的变化是独立的。完成您正在尝试的最简单方法是使用 Manager 在进程之间进行通信。您可以创建 output_container 并将其传递给每个函数,以便他们可以访问和修改它。例如:

import multiprocessing as mp


def web_scrape1(output_container: list):
    sample_text = 'value from web_scrape1'
    output_container.append(sample_text)


def web_scrape2(output_container: list):
    sample_text = 'value from web_scrape2'
    output_container.append(sample_text)


if __name__ == "__main__":
    output_container = mp.Manager().list()

    worker1 = mp.Process(target=web_scrape1, args=(output_container,))
    worker2 = mp.Process(target=web_scrape2, args=(output_container,))

    worker1.start()
    worker2.start()

    worker1.join()
    worker2.join()

    print(output_container)
    >>> ['value from web_scrape1', 'value from web_scrape2']

您可以在 docs 中找到更多信息。