Windows 10上的多处理问题

2022-01-19 01:00:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用多处理收集网站列表的主页大小。代码如下:

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倍

这里的错误是什么?有人能帮忙吗

提前谢谢

萨钦

2条回答
网友
1楼 ·

我认为您误解了pool.imap_unordered的工作原理,提供的函数将使用sites中的一个值调用,而在您的例子中,您实际上完全放弃了提供的url并对sites列表中的所有值进行循环

你应该做的很简单

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

doc

网友
2楼 ·

几个问题:

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)

相关问题