超过CPU/内核数后,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

我正在学习如何在Python中使用多核。在下面的脚本中,我试图从网页列表中删除标题

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_站点
中创建了一个循环,它似乎可以工作。如果您对如何改进代码有任何进一步的建议,请告诉我。谢谢你,奥利弗。