获得了代码块:
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 并收集其返回值,如此处所述。