Windows 10 上的多处理问题
Multiprocessing issue on 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}')
我有一台 Windows 10 笔记本电脑 Python 3.9 运行。我没有使用 venv。
此代码进入一个循环 - 执行 4 次并花费 4 倍的时间。
这里有什么错误?有人可以帮忙吗?
提前致谢
萨钦
几个问题:
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 没有 return 任何内容 --> 请参阅上面了解您需要的内容
- 不需要循环
for result in pool.imap_unordered(sitesize, sites):
--> 改为 result = pool.map(sitesize, sites)
我认为您误解了 pool.imap_unordered
的工作原理,将使用 sites
中的值之一调用提供的函数,而在您的情况下,您实际上完全放弃了提供的 [=13] =] 并循环 sites
列表中的所有值。
你应该简单地做
def sitesize(url):
with urllib.request.urlopen(url) as u:
page = u.read()
print(url, len(page))
参见doc。
我正在尝试使用多处理收集网站列表的主页大小。以下是代码:
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}')
我有一台 Windows 10 笔记本电脑 Python 3.9 运行。我没有使用 venv。
此代码进入一个循环 - 执行 4 次并花费 4 倍的时间。
这里有什么错误?有人可以帮忙吗?
提前致谢
萨钦
几个问题:
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 没有 return 任何内容 --> 请参阅上面了解您需要的内容
- 不需要循环
for result in pool.imap_unordered(sitesize, sites):
--> 改为result = pool.map(sitesize, sites)
我认为您误解了 pool.imap_unordered
的工作原理,将使用 sites
中的值之一调用提供的函数,而在您的情况下,您实际上完全放弃了提供的 [=13] =] 并循环 sites
列表中的所有值。
你应该简单地做
def sitesize(url):
with urllib.request.urlopen(url) as u:
page = u.read()
print(url, len(page))
参见doc。