使用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中的多处理将项目附加到列表中的主要内容,如果未能解决你的问题,请参考以下文章