Windows 10上的多处理问题

问题描述

我正在尝试使用多处理方法来收集网站列表的首页大小。以下是代码

import time
from multiprocessing import Pool,TimeoutError

start = time.time()


def sitesize(url):
    for url in sites:
        with urllib.request.urlopen(url) as u:
            page = u.read()
            print(url,len(page))


sites = [
    'https://www.yahoo.com','http://www.cnn.com','http://www.python.org','http://www.jython.org','http://www.pypy.org','http://www.perl.org','http://www.cisco.com','http://www.facebook.com','http://www.twitter.com','http://arstechnica.com','http://www.reuters.com','http://www.abcnews.com','http://www.cnbc.com',]

if __name__ == '__main__': 

    with Pool(processes=4) as pool:
        for result in pool.imap_unordered(sitesize,sites):
            print(result)

print(f'Time taken : {time.time() - start}')

我有一台运行Python 3.9的Windows 10笔记本电脑。我没有使用venv。

代码进入循环-执行4次,所需时间增加4倍。

这是什么错误?有人可以帮忙吗?

预先感谢

Sachin

解决方法

我认为您误解了pool.imap_unordered的工作方式,将使用sites中的值之一调用提供的函数,而实际上您完全丢弃了提供的url并循环访问sites列表中的所有值。

您应该简单地做

def sitesize(url):
    with urllib.request.urlopen(url) as u:
        page = u.read()
        print(url,len(page))

请参见doc

,

少数问题:

def sitesize(url):
    result = {}
    for url in sites:
        with urllib.request.urlopen(url) as u:
            page = u.read()
            result[url] = len(page)
    return result
  • sitesize不返回任何内容->见上文,了解所需内容
  • 不需要循环for result in pool.imap_unordered(sitesize,sites): ->更改为result = pool.map(sitesize,sites)