pool.map的第二个参数想传入多个咋整?
from functools import partial from multiprocessing import Pool as ThreadPool pageurls=[] if maxpage: for page in range(2, maxpage + 1): pageurl = url + '&page=%s#mSearch' % page pageurls.append(pageurl) with ThreadPool() as pool: results = pool.map(partial(get_one_page,level1=level1,level2=level2,level3=level3,name=name),pageurls) def get_one_page(pageurl,level1,level2,level3,name): print("正在爬取的url", pageurl) p_list = parser_md_index(pageurl) for p in p_list: product_url, img, p_br, p_name, p_price, old_price = p['product_url'], p['img'], p['p_br'], p[ 'p_name'], p['p_price'], p['old_price'] product_with(level1, level2, level3, name, p_br, p_name, p_price, old_price, product_url, img) name = re.sub('\"', '\'', name) p_name = re.sub('\"', '\'', p_name) sql = 'INSERT INTO modern_product (level1,level2,level3,level4,p_br,p_name,p_price,old_price,product_url,img) VALUES ("{}","{}","{}","{}","{}","{}","{}","{}","{}","{}")'.format( level1, level2, level3, name, p_br, p_name, p_price, old_price, product_url, img) cur.execute(sql) conn.commit()
multiprocessing 用的最多的是pool.map,类似的还有pool.map_async这个是异步的,这两个需要传递的参数不同,另外python3不建议使用pool.apply了,具体我不很清楚自己查。
简单解释下上面代码用的参数,其中partial是一个偏函数,关于它的用法参照(我看着挺全的):https://blog.csdn.net/appleyk/article/details/77609114
pool.map(partial(get_one_page,level1=level1,level2=level2,level3=level3,name=name),pageurls)
上面这句核心部分,在理解这句之前你需要知道什么是偏函数,什么是迭代类型参数,map是如何工作
poo.map() 传递的是两个参数第一个参数是一个函数名(不带()),第二个参数是个迭代对象。
一般情况第二个参数,传入一个迭代就够用了。
但是我这个就比较牛逼了,需要传入一个列表和几个字符串给get_one_page函数
最好使用关键字参数和函数的参数一一对应起来。
pool.map(partial(get_one_page,level1=level1,level2=level2,level3=level3,name=name),pageurls)的level1,level2,level3,name
get_one_page(pageurl,level1,level2,level3,name)的level1,level2,level3,name就是level1,level2,level3,name几个参数=后面的值,为了好理解我们可以改成下面这样。
pool.map(partial(get_one_page,a=level1,b=level2,c=level3,d=name),pageurls)
get_one_page(pageurl,a,b,c,d)
好了 这样就懂了吧。
我也很菜 哪地方不对的请大家多多指点。