import time from concurrent.futures import ProcessPoolExecutor, as_completed
NUMBERS = range(30, 40)
deffib(n): if n <= 2: return1 return fib(n-1) + fib(n-2)
if __name__ == '__main__': start = time.time()
with ProcessPoolExecutor(max_workers=3) as executor: # max_workers 是启动进程的个数 for num, result in zip(NUMBERS, executor.map(fib, NUMBERS)): print(f'fib({num}) = {result}')
from concurrent.futures import ThreadPoolExecutor, as_completed # 使用了 ThreadPoolExecutor 线程池
NUMBERS = range(30, 35)
deffib(n): if n == 34: raise Exception('Don\' t do this') if n <= 2: return1 return fib(n-1) + fib(n-2)
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=3) as executor: future_to_num = {executor.submit(fib, num): num for num in NUMBERS}
for future in as_completed(future_to_num): num = future_to_num[future] try: result = future.result() except Exception as e: print(f'raise an exception: {e}') else: print(f'fib({num}) = {result}')
with ThreadPoolExecutor(max_workers=3) as executor: for num, result in zip(NUMBERS, executor.map(fib, NUMBERS)): print(f'fib({num}) = {result}')
# 输出: raise an exception: Don' t do this fib(32) = 2178309 fib(31) = 1346269 fib(30) = 832040 fib(33) = 3524578 fib(30) = 832040 fib(31) = 1346269 fib(32) = 2178309 fib(33) = 3524578 Traceback (most recent call last): ...... ...... Exception: Don' t do this
import time from multiprocessing.pool import Pool from concurrent.futures import as_completed, ProcessPoolExecutor
NUMBERS = range(1, 100000) K = 50
deff(x): r = 0 for k in range(1, K+2): r += x ** (1 / k**1.5) return r
if __name__ == '__main__': print('multiprocessing.pool.Pool:\n') start = time.time()
l = [] pool = Pool(3) for num, result in zip(NUMBERS, pool.map(f, NUMBERS)): l.append(result) print(len(l)) print('COST: {}'.format(time.time() - start))
print('ProcessPoolExecutor without chunksize:\n') start = time.time()
l = [] with ProcessPoolExecutor(max_workers=3) as executor: for num, result in zip(NUMBERS, executor.map(f, NUMBERS)): l.append(result)
print(len(l))
print('COST: {}'.format(time.time() - start))
print('ProcessPoolExecutor with chunksize:\n') start = time.time()
l = [] with ProcessPoolExecutor(max_workers=3) as executor: # 保持和multiprocessing.pool的默认chunksize一样 chunksize, extra = divmod(len(NUMBERS), executor._max_workers * 4)
for num, result in zip(NUMBERS, executor.map(f, NUMBERS, chunksize=chunksize)): l.append(result)
print(len(l))
print('COST: {}'.format(time.time() - start))
# 输出: multiprocessing.pool.Pool:
99999 COST: 1.0891921520233154 ProcessPoolExecutor without chunksize:
99999 COST: 70.94592714309692 ProcessPoolExecutor with chunksize: