我正在尝试使用
在执行期间,我注意到从任务管理器/系统监视器/top中只有一个cpu/线程不断运行,尽管对
concurrent.futures.ProcessPoolExecutor
来并行化串行任务。该串行任务涉及从数字范围中查找给定数字的出现次数。我的代码如下。在执行期间,我注意到从任务管理器/系统监视器/top中只有一个cpu/线程不断运行,尽管对
processPoolExecutor
的max_workers参数赋了大于1的值。为什么会出现这种情况?我如何使用concurrent.futures
将我的代码并行化?我的代码是在python 3.5上执行的。import concurrent.futures as cf
from time import time
def _findmatch(nmax, number):
print('def _findmatch(nmax, number):')
start = time()
match=[]
nlist = range(nmax)
for n in nlist:
if number in str(n):match.append(n)
end = time() - start
print("found {} in {}sec".format(len(match),end))
return match
def _concurrent(nmax, number, workers):
with cf.ProcessPoolExecutor(max_workers=workers) as executor:
start = time()
future = executor.submit(_findmatch, nmax, number)
futures = future.result()
found = len(futures)
end = time() - start
print('with statement of def _concurrent(nmax, number):')
print("found {} in {}sec".format(found, end))
return futures
if __name__ == '__main__':
match=[]
nmax = int(1E8)
number = str(5) # Find this number
workers = 3
start = time()
a = _concurrent(nmax, number, workers)
end = time() - start
print('main')
print("found {} in {}sec".format(len(a),end))
concurrent.futures.ProcessPoolExecutor
不应该自动将解决给定函数的工作分配给其工作池中的工作人员吗? - Sun BearProcessPoolExecutor
负责调用给定的块由工人运行。请注意,在示例中,我可以将任务分成10个不同的任务,最终结果将是相同的(当然,控制台输出将不同,因为_findmatch
将运行10次)。 - niemmiexecutor.map()
的性能进行比较。 - Sun Bear.submit()
和.map()
进行了基准测试,与串行代码进行了比较 https://dev59.com/eOk5XIcBkEYKwwoY_O-N。如果您有时间,请发表评论。 - Sun Bear