Skip to content

Commit

Permalink
fix code in ch4.2 concurrent.futures.ProcessPoolExecutor
Browse files Browse the repository at this point in the history
close #16
  • Loading branch information
laixintao committed Oct 10, 2017
1 parent 0e020de commit d2214aa
Showing 1 changed file with 69 additions and 70 deletions.
139 changes: 69 additions & 70 deletions chapter4/02_Using_the_concurrent.futures_Python_modules.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,82 +41,81 @@ Executor是抽象类,可以通过子类访问,即线程或进程的 ``Execut
- 通过有5个worker的线程池执行
- 通过有5个worker的进程池执行

(译者注:原文的代码是错误的,这里贴出的代码以及运行结果是修改后的,详见: `关于第四章第2节书中程序的疑问 #16 <https://github.com/laixintao/python-parallel-programming-cookbook-cn/issues/16>`_ ,感谢 `@Microndgt <https://github.com/Microndgt>`_ 提出)
代码如下:::

# -*- coding: utf-8 -*-

""" Concurrent.Futures Pooling - Chapter 4 Asynchronous Programming """

import concurrent.futures
import time
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def evaluate_item(x):
# 计算总和,这里只是为了消耗时间
result_item = count(x)
# 打印输入和输出结果
print ("item " + str(x) + " result " + str(result_item))

def count(number) :
for i in range(0, 10000000):
i=i+1
return i * number

if __name__ == "__main__":
# 顺序执行
start_time = time.clock()
for item in number_list:
evaluate_item(item)
print("Sequential execution in " + str(time.clock() - start_time), "seconds")
# 线程池执行
start_time_1 = time.clock()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
for item in number_list:
executor.submit(evaluate_item, item)
print ("Thread pool execution in " + str(time.clock() - start_time_1), "seconds")
# 进程池
start_time_2 = time.clock()
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
for item in number_list:
executor.submit(evaluate_item, item)
print ("Process pool execution in " + str(time.clock() - start_time_2), "seconds")
import concurrent.futures
import time
number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def evaluate_item(x):
# 计算总和,这里只是为了消耗时间
result_item = count(x)
# 打印输入和输出结果
return result_item

def count(number) :
for i in range(0, 10000000):
i=i+1
return i * number

if __name__ == "__main__":
# 顺序执行
start_time = time.time()
for item in number_list:
print(evaluate_item(item))
print("Sequential execution in " + str(time.time() - start_time), "seconds")
# 线程池执行
start_time_1 = time.time()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(evaluate_item, item) for item in number_list]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print ("Thread pool execution in " + str(time.time() - start_time_1), "seconds")
# 进程池
start_time_2 = time.time()
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(evaluate_item, item) for item in number_list]
for future in concurrent.futures.as_completed(futures):
print(future.result())
print ("Process pool execution in " + str(time.time() - start_time_2), "seconds")

运行这个代码,我们可以看到运行时间的输出:::

$ python3 pool.py
item 1 result 10000000
item 2 result 20000000
item 3 result 30000000
item 4 result 40000000
item 5 result 50000000
item 6 result 60000000
item 7 result 70000000
item 8 result 80000000
item 9 result 90000000
item 10 result 100000000
Sequential execution in 7.495329 seconds
item 1 result 10000000
item 2 result 20000000
item 4 result 40000000
item 3 result 30000000
item 5 result 50000000
item 8 result 80000000
item 7 result 70000000
item 9 result 90000000
item 6 result 60000000
item 10 result 100000000
Thread pool execution in 8.349609000000001 seconds
item 1 result 10000000
item 2 result 20000000
item 3 result 30000000
item 4 result 40000000
item 5 result 50000000
item 7 result 70000000
item 8 result 80000000
item 6 result 60000000
item 9 result 90000000
item 10 result 100000000
Process pool execution in 0.02012900000000073 seconds
10000000
20000000
30000000
40000000
50000000
60000000
70000000
80000000
90000000
100000000
Sequential execution in 7.936585903167725 seconds
10000000
30000000
40000000
20000000
50000000
70000000
90000000
100000000
80000000
60000000
Thread pool execution in 7.633088827133179 seconds
40000000
50000000
10000000
30000000
20000000
70000000
90000000
60000000
80000000
100000000
Process pool execution in 4.787093639373779 seconds

|work|
------
Expand Down

0 comments on commit d2214aa

Please sign in to comment.