Python Thread Pool传参只一个怎么破?

2017-06-09 作者:

作为批量化操作的method,map比apply要方便简洁一些,至少不用for循环一堆东西
【注1】apply现已不用,因为实际使用基本等价于单进程操作
【注2】至于map之于map_async,及apply之于apply_async,是另外一个话题,可以参考这里
回到之前的话题,apply传参 – 可以清晰的看到,apply可以随意带args,多少个都没关系

#格式: apply(func[, args[, kwds]])
#比如
pool.apply(func=f, args=(20,30,))

而map传参 – 函数f只允许带一个参数,就是iterable里可以迭代的list
#格式: map(func, iterable[, chunksize])
#比如
pool.map(func=f, iterable=[1,2,3])

那么我们如何保留map这样的代码简洁性,同时也可以传多个参数呢?
这就用到了partial,把函数的定参放在partial内去传,变参依然iterable – 至少不需要把定参做成全局变量直接传给insert_and_process函数了
【注】对python2而言,partial只在2.7版本后支持 – 关于partial的说明在这里
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个毛啊。。。

原创文章,转载请注明链接: Python Thread Pool传参只一个怎么破?(注:本站图像可单击浏览大图)

完整阅读本篇»