使用Python中的多处理将项目附加到列表中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Python中的多处理将项目附加到列表中相关的知识,希望对你有一定的参考价值。

得到这段代码:

def get_spain_accomodations():
    pool = Pool()
    links = soup.find_all('a', class_="hotel_name_link url")
    pool.map(get_page_links, links)

    #for a in soup.find_all('a', class_="hotel_name_link url"):
    #    hotel_url = "https://www.booking.com" + a['href'].strip()
    #    hotels_url_list.append(hotel_url)

def get_page_links(link):
     hotel_url = "https://www.booking.com" + link['href'].strip()
     hotels_url_list.append(hotel_url)

由于某种原因,hotel_url未被附加到列表中。如果我尝试使用注释循环它实际上工作,但不是map()函数。我还为每个get_page_links调用打印了hotel_url并且它有效。我不知道发生了什么事。以下是函数调用。

init_BeautifulSoup()
get_spain_accomodations()
#get_hotels_wifi_rating()

for link in hotels_url_list:
    print link

代码执行没有错误但链接列表没有打印。

答案

了解进程在隔离的内存区域中运行非常重要。每个进程都有自己的hotels_url_list实例,并且没有(简单)方法将这些值“粘贴”到父进程列表中:如果在父进程中创建了list的实例,那么该实例与子进程的实例不同use:当你执行.fork()(也称为创建子进程)时,父进程的内存将克隆在子进程上。所以,如果父母在list变量中有一个hotels_url_list的实例,你在子进程中也会有一个list(也称为hotels_url_list)的实例,但它们不会相同(它们会占用内存中的不同区域) 。

Threads不会发生这种情况。他们分享记忆。

我会说(这不是我在这里的专家),在这种情况下,传递流程的规范方式是Queue:子进程将事物放入队列,父进程抓住它们:

from multiprocessing import Process, Queue


def get_spain_accomodations():
    q = Queue()
    processes = []
    links = ['http://foo.com', 'http://bar.com', 'http://baz.com']
    hotels_url_list = []
    for link in links:
        p = Process(target=get_page_links, args=(link, q,))
        p.start()
        processes.append(p)
    for p in processes:
        p.join()
        hotels_url_list.append(q.get())
    print("Collected: %s" % hotels_url_list)


def get_page_links(link, q):
    print("link==%s" % link)
    hotel_url = "https://www.booking.com" + link
    q.put(hotel_url)


if __name__ == "__main__":
    get_spain_accomodations()

这将输出每个链接前面加上https://www.booking.com,这是在独立进程上发生的预先发生的事件:

link==http://foo.com
link==http://bar.com
link==http://baz.com
Collected: ['https://www.booking.comhttp://foo.com', 'https://www.booking.comhttp://bar.com', 'https://www.booking.comhttp://baz.com']

我不知道它是否会对你有所帮助,但对我而言,它有助于将Queue视为两个进程都知道的“共享文件”。想象一下,你有两个完全不同的程序,其中一个知道必须将东西写入一个名为/tmp/foobar.txt的文件中,另一个知道必须从一个名为/tmp/foobar.txt的文件中读取。这样他们就可以相互“沟通”。这一段只是一个“比喻”(虽然这几乎就是Unix pipes的工作原理)......不像队列那样工作,但也许它有助于理解这个概念? Dunno,真的,也许我让它更令人困惑......

另一种方法是使用Threads并收集它们的返回值,如here所述。

以上是关于使用Python中的多处理将项目附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章

Python:将 a 附加到字典中的列表

将项目附加到字典 Python

将项目附加到列表理解中的列表

以追加到列表为结果的多处理 for 循环

将新项目附加到列表中的列表

如何在另一个python文件中的列表中附加一些东西?