超过CPU/内核数后,Python多处理将无法继续
我正在学习如何在Python中使用多核。在下面的脚本中,我试图从网页列表中删除标题超过CPU/内核数后,Python多处理将无法继续,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,我正在学习如何在Python中使用多核。在下面的脚本中,我试图从网页列表中删除标题 import multiprocessing import requests from bs4 import BeautifulSoup sites = ( 'http://penny-arcade.com/', 'http://reallifecomics.com/', 'http://sinfest.net/', 'http://userfr
import multiprocessing
import requests
from bs4 import BeautifulSoup
sites = (
'http://penny-arcade.com/',
'http://reallifecomics.com/',
'http://sinfest.net/',
'http://userfriendly.org/',
'http://savagechickens.com/',
'http://xkcd.com/',
'http://duelinganalogs.com/',
'http://cad-comic.com/',
'http://samandfuzzy.com/',
)
def scrape_site(q):
url = q.get()
try:
page = requests.get(url)
soup = BeautifulSoup(page.content, 'lxml')
print url
print soup.title.text
print
except:
print url
print "No TITLE"
print
def run_multicore_scraper():
workers = multiprocessing.cpu_count() # num of cpus or workers
# put all sites into a queue
q = multiprocessing.Queue()
for s in sites:
q.put(s)
# create as many processes as workers
processes = []
for w in xrange(workers):
p = multiprocessing.Process(target=scrape_site, args=(q, ))
p.start()
processes.append(p)
# wait for processes to complete
for p in processes:
p.join()
if __name__ == '__main__':
run_multicore_scraper()
我一直在想为什么这个脚本没有遍历所有站点,而是停留在我设置的工作人员数量上。例如,我将worker的数量设置为通过multiprocessing.cpu\u count()
计算的cpu数量。在我的本地机器上,这是4,我的脚本只迭代到第四个url。因此,输出如下所示:
http://userfriendly.org/
UserFriendly.Org
http://penny-arcade.com/
Penny Arcade
http://sinfest.net/
Sinfest
http://reallifecomics.com/
Real Life Comics ©1999-2016 Greg Dean
我希望有九个打印输出,因为我有九个网址在我的网站列表。如果我硬编码2作为我的工作者数量,脚本将只打印出前2个URL。6号也一样。如果我输入一个数字>len(sites)
,所有的URL都会打印出来,但随后系统会挂起,这可能是因为已经启动了一些进程,但由于队列中没有更多的URL要处理,所以从未完成
我知道在我的脚本中,我创建了尽可能多的进程,但这也是我创建这个玩具示例所遵循的方法。我认为无论我创建了多少个进程,我的脚本都会在整个站点列表中运行,就像本教程如何成功地实现这一点一样
有人能发现为什么我的脚本没有遍历我的整个站点列表,而是在n=#workers的第n个元素处短停吗?你的
scrape\u site
方法只抓取一个站点-它不会循环尝试从队列中提取越来越多的事件。你在这里派了4名工人:
for w in xrange(workers):
p = multiprocessing.Process(target=scrape_site, args=(q, ))
p.start()
processes.append(p)
因此,这4名工作人员中的每一位都将启动,运行您告诉他们运行的方法,该方法将刮取一个站点,然后完成
一种方法是让
scrape\u site
方法运行一个循环,将站点从队列中拉出来,直到它们发现队列是空的。另一种方法是使用该库中的内容,然后将要刮取的站点列表交给用户。但在这种方法中的worker
方法不也是在一个站点上执行操作吗而不是在网站列表中循环?这就是为什么我编写了我的scrape\u站点
方法来只刮取一个站点。在使用multiprocessing.Process
之前,我尝试了multiprocessing.Pool
,但我遇到了一个分段错误:11错误。这就是为什么我尝试使用multiprocessing.Process
来执行多处理。不,它有一个循环:“对于iter中的url(work_queue.get,'STOP'):“你说得对。我在scrape_站点
中创建了一个循环,它似乎可以工作。如果您对如何改进代码有任何进一步的建议,请告诉我。谢谢你,奥利弗。