使用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)

由于某种原因,酒店没有附加到列表中。如果我尝试使用评论的循环,则实际上可以使用,但不使用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的实例,该实例与子过程使用的情况不同:当您进行.fork()(又称创建子程序)时,子过程的内存为 CLONED 在子过程中。因此,如果父母在hotels_url_list变量中具有list的实例,则您还将在子过程中具有list的实例(也称为hotels_url_list),但它们不会相同(它们将在内存中占据不同的区域)。

这不会使用 threads 发生。他们确实共享记忆。

我会说(这并不是说我是这里的专家),在这种情况下,传达流程的规范方式将是一个队列:孩子的过程将事物放在队列中,父母的过程抓住了它们:

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']

我不知道它是否会帮助您,但是对我来说,这有助于将队列视为两个过程都知道的"共享文件"。想象一下,您有两个完整的程序,其中一个知道必须将内容写入名为/tmp/foobar.txt的文件中,而另一个必须将其写入名为/tmp/foobar.txt的文件中。这样,他们可以彼此"交流"。本段只是一个"隐喻"(尽管这几乎是Unix管道的工作方式)...并不像排队完全工作,但也许它有助于理解概念?dunno,真的,也许我让它更令人困惑...

另一种方法是使用 threads 并收集其返回值,如此处所述。

相关内容

  • 没有找到相关文章

最新更新