1.案例:将下列代码修改为并发 / 并行
# -*- encoding -*-
'''
py 3.6
sulime
'''
import time
now = lambda: time.perf_counter()
def cpu_bound(number):
print(sum(i * i for i in range(number)))
def calculate_sums(numbers):
for number in numbers:
cpu_bound(number)
def main():
start_time = now()
numbers = [10000000 + x for x in range(20)]
calculate_sums(numbers)
print('Calculation takes {} seconds'.format(now() - start_time))
if __name__ == '__main__':
main()
333333283333335000000
333333383333335000000
333333483333355000001
333333583333395000005
333333683333455000014
333333783333535000030
333333883333635000055
333333983333755000091
333334083333895000140
333334183334055000204
333334283334235000285
333334383334435000385
333334483334655000506
333334583334895000650
333334683335155000819
333334783335435001015
333334883335735001240
333334983336055001496
333335083336395001785
333335183336755002109
Calculation takes 48.105352255870834 seconds
[Finished in 48.4s]
- 并行
concurrent.futures.ProcessPoolExecutor
# -*- encoding -*-
'''
py 3.6
sulime
'''
import time
import asyncio
import concurrent.futures
now = lambda: time.perf_counter()
def cpu_bound(number):
print(sum(i * i for i in range(number)))
def calculate_sums(numbers):
with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
executor.map(cpu_bound, numbers)
def main():
start_time = now()
numbers = [10000000 + x for x in range(20)]
calculate_sums(numbers)
print('Calculation takes {} seconds'.format(now() - start_time))
if __name__ == '__main__':
main()
333333283333335000000
333333683333455000014
333334083333895000140
333334483334655000506
333334883335735001240
333333583333395000005
333333783333535000030
333334183334055000204
333334583334895000650
333334983336055001496
333333483333355000001
333333883333635000055
333334283334235000285
333334683335155000819
333335083336395001785
333333383333335000000
333333983333755000091
333334383334435000385
333334783335435001015
333335183336755002109
Calculation takes 29.531448646344682 seconds
[Finished in 30.0s]
- 并行 from multiprocessing import Pool
# -*- encoding -*-
'''
py 3.6
sulime
'''
import time
import concurrent.futures
from multiprocessing import Pool
now = lambda: time.perf_counter()
def cpu_bound(number):
print(sum(i * i for i in range(number)))
def calculate_sums(numbers):
p = Pool(4)
for num in numbers:
p.apply_async(cpu_bound, args=(num,))
p.close()
p.join()
def main():
start_time = now()
numbers = [10000000 + x for x in range(20)]
calculate_sums(numbers)
print('Calculation takes {} seconds'.format(now() - start_time))
if __name__ == '__main__':
main()
333333483333355000001
333333883333635000055
333334283334235000285
333334583334895000650
333334883335735001240
333333383333335000000
333333683333455000014
333334083333895000140
333334483334655000506
333334983336055001496
333333283333335000000
333333783333535000030
333334183334055000204
333334683335155000819
333335083336395001785
333333583333395000005
333333983333755000091
333334383334435000385
333334783335435001015
333335183336755002109
Calculation takes 30.378088310139 seconds
[Finished in 31.3s]
- 并行multiprocessing.Pool
# -*- encoding -*-
'''
py 3.6
sulime
'''
import time
import concurrent.futures
from multiprocessing import Pool
now = lambda: time.perf_counter()
def cpu_bound(number):
# print(sum(i * i for i in range(number)))
return sum(i*i for i in range(number))
def calculate_sums(numbers):
# # 1.0 49s
# for number in numbers:
# cpu_bound(number)
# # 2.0 30s
# with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
# executor.map(cpu_bound, numbers)
# # 3.0 30s
# with concurrent.futures.ProcessPoolExecutor(max_workers=3) as executor:
# for num in numbers:
# executor.submit(cpu_bound, num)
# # 4.0 30s
# p = Pool(4)
# for num in numbers:
# p.apply_async(cpu_bound, args=(num,))
# p.close()
# p.join()
# 5.0 30s
# cpu_bound return -**-
with Pool(4) as p:
print(p.map(cpu_bound, numbers))
def main():
start_time = now()
numbers = [10000000 + x for x in range(20)]
calculate_sums(numbers)
print('Calculation takes {:.2f} s'.format(now() - start_time))
if __name__ == '__main__':
main()
# [333333283333335000000, 333333383333335000000, 333333483333355000001, 333333583333395000005, 333333683333455000014, 333333783333535000030, 333333883333635000055, 333333983333755000091, 333334083333895000140, 333334183334055000204, 333334283334235000285, 333334383334435000385, 333334483334655000506, 333334583334895000650, 333334683335155000819, 333334783335435001015, 333334883335735001240, 333334983336055001496, 333335083336395001785, 333335183336755002109]
# Calculation takes 29.67 s
# [Finished in 30.2s]