1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 from concurrent.futures import ThreadPoolExecutor, as_completed 4 from concurrent.futures import ProcessPoolExecutor 5 import time 6 7 # 消耗cpu的操作,用多进程编程,对于io操作来说,使用多线程编程,进程切换代价要高于线程 8 9 # 1.对于耗费cpu的操作,计算 10 11 12 def fib(n): 13 if n <= 2: 14 return 1 15 return fib(n-1) + fib(n-2) 16 17 18 # 在windows下,多进程编程一定需要放在if __name__ == '__main__':中,linux中不存在这个问题 19 if __name__ == '__main__': 20 # 实现了__enter__ 和 __exit__ 21 # 多线程 22 with ThreadPoolExecutor(max_workers=3) as executor: 23 all_task = [executor.submit(fib, (num)) for num in range(25, 35)] 24 start_time = time.time() 25 for future in as_completed(all_task): 26 data = future.result() 27 print('exe result {} '.format(data)) 28 thread_last_time = time.time() - start_time 29 print('last time is {} '.format(thread_last_time)) 30 31 # 多进程 32 with ProcessPoolExecutor(max_workers=3) as executor: 33 all_task = [executor.submit(fib, (num)) for num in range(25, 35)] 34 start_time = time.time() 35 for future in as_completed(all_task): 36 data = future.result() 37 print('exe result {} '.format(data)) 38 process_last_time = time.time() - start_time 39 print('last time is {} '.format(process_last_time)) 40 41 print('多进程比多线程快 {} 秒'.format(thread_last_time - process_last_time))
exe result 75025
exe result 121393
exe result 196418
exe result 317811
exe result 514229
exe result 832040
exe result 1346269
exe result 2178309
exe result 3524578
exe result 5702887
last time is 4.179819107055664
exe result 75025
exe result 121393
exe result 196418
exe result 317811
exe result 514229
exe result 832040
exe result 1346269
exe result 2178309
exe result 3524578
exe result 5702887
last time is 2.224078893661499
多进程比多线程快 1.955740213394165 秒
对于耗费cpu的操作,例如计算。多进程优于多线程
对于io操作,多线程优于多进程
1 #!/user/bin/env python 2 # -*- coding:utf-8 -*- 3 from concurrent.futures import ThreadPoolExecutor, as_completed 4 from concurrent.futures import ProcessPoolExecutor 5 import time 6 7 # 消耗cpu的操作,用多进程编程,对于io操作来说,使用多线程编程,进程切换代价要高于线程 8 9 # 2.对于io操作来说,多线程优于多进程 10 11 12 def random_sleep(n): 13 time.sleep(n) 14 return n 15 16 17 # 在windows下,多进程编程一定需要放在if __name__ == '__main__':中,linux中不存在这个问题 18 if __name__ == '__main__': 19 # 实现了__enter__ 和 __exit__ 20 # 多线程 21 with ThreadPoolExecutor(max_workers=3) as executor: 22 all_task = [executor.submit(random_sleep, (n)) for n in [2]*30] 23 start_time = time.time() 24 for future in as_completed(all_task): 25 data = future.result() 26 print('exe result {} '.format(data)) 27 thread_last_time = time.time() - start_time 28 print('last time is {} '.format(thread_last_time)) 29 30 # 多进程 31 with ProcessPoolExecutor(max_workers=3) as executor: 32 all_task = [executor.submit(random_sleep, (n)) for n in [2]*30] 33 start_time = time.time() 34 for future in as_completed(all_task): 35 data = future.result() 36 print('exe result {} '.format(data)) 37 process_last_time = time.time() - start_time 38 print('last time is {} '.format(process_last_time)) 39 40 print('多线程比多进程快 {} 秒'.format(process_last_time - thread_last_time))
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
last time is 20.007108688354492
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
exe result 2
last time is 20.16208267211914
多线程比多进程快 0.15497398376464844 秒