Python Thread Pool传参只一个怎么破?
作为批量化操作的method,map比apply要方便简洁一些,至少不用for循环一堆东西
【注1】apply现已不用,因为实际使用基本等价于单进程操作
【注2】至于map之于map_async,及apply之于apply_async,是另外一个话题,可以参考这里
回到之前的话题,apply传参 – 可以清晰的看到,apply可以随意带args,多少个都没关系
1 2 3 4 |
#格式: apply(func[, args[, kwds]]) #比如 pool.apply(func=f, args=(20,30,)) 而map传参 - 函数f只允许带一个参数,就是iterable里可以迭代的list |
1 2 3 4 5 6 |
#格式: map(func, iterable[, chunksize]) #比如 pool.map(func=f, iterable=[1,2,3]) 那么我们如何保留map这样的代码简洁性,同时也可以传多个参数呢? 这就用到了partial,把函数的定参放在partial内去传,变参依然iterable - 至少不需要把定参做成全局变量直接传给insert_and_process函数了 【注】对python2而言,partial只在2.7版本后支持 - 关于partial的说明在<a href="http://www.wklken.me/posts/2013/08/18/python-extra-functools.html#functoolspartial" target="_blank" rel="noopener noreferrer">这里</a> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from multiprocessing.dummy import Pool from functools import partial def insert_and_process((file_to_process,db)): db.table.insert(**parse_file(file_to_process)) return True if __name__=="__main__": file_list=os.listdir(".") db = DAL("path_to_mysql" + db) P = Pool(processes=4) P.map(partial(insert_and_process, db=db), file_list) #定参放在partial内,变参按照map标准写法去传 P.close() P.join() print 'Done.' |
有的同学可能要问 –
Q: 那如果两个(或多个)参数都是变参呢?
A: 开动一下脑筋吧 – 一起打进iterable里可好?
Q: 如果变参B与A不具备同样的iterable特性呢?
A: 擦的咧 – 那还map个毛啊。。。
文章的脚注信息由WordPress的wp-posturl插件自动生成
完整阅读本篇»