计时器功能,用于计算multi_core_1和multi_core_2之间的成本时间
results = p.map_async(deal, urls)
for url in urls:
results = p.map_async(deal, url)
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import time
import logging
from functools import wraps
from multiprocessing.dummy import Pool, Queue, Manager, freeze_support
import requests
urls = [
'http://www.baidu.com',
'http://home.baidu.com/',
```
another 100 urls
]
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
t = time.time()
back = func(*args, **kwargs)
logging.warn('%s cost %s' % (func.__name__, (time.time()-t)))
return back
return wrapper
def deal(url):
return requests.get(url).status_code
@timer
def multi_core_1():
freeze_support()
p = Pool(8)
results = p.map_async(deal, urls)
p.close()
p.join()
@timer
def multi_core_2():
freeze_support()
p = Pool(8)
for url in urls:
results = p.map_async(deal, url)
p.close()
p.join()
if __name__ == '__main__':
multi_core_1()
multi_core_2()
> python test.py
WARNING:root:multi_core_1 cost 1.3149404525756836
WARNING:root:multi_core_2 cost 0.2142746448516845
所以我想知道multi_core_2()如何比multi_core_1()
更快答案 0 :(得分:0)
实际上它并不快。计算性能是错误的方法,因为它取决于IO等待。我猜你的multi_core_2()
速度更快,因为DNS已在multi_core_1()
执行时得到解析和缓存。
答案 1 :(得分:0)
在第二个功能中,您使用map_async
错误。
map_async
需要应用函数和可迭代。
当您将字符串作为可迭代项传递时,它会将字符串中的每个字符视为元素。因此,对于列表中的每个URL,它会尝试将deal
函数单独应用于每个字符('h','t','t'等)。显然这在requests.get
完全失败,所以它立即失败,不必加载页面,因此更快;但是它破碎的代码不起作用。
您还要在每次循环迭代时分配给results
,因此它会在每个新URL上覆盖自己,并且只包含最后一个URL字符串的错误代码。
在检查功能性能之前,请确保该功能实际按预期工作。