py 单进程 -> 多进程

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值