计算(cpu)密集型任务
:在CPython中由于GIL锁的原因,导致对于计算(cpu)密集型任务来说,多线程的效率还没有单线程效率高。因此对于CPython中计算密集型任务来说使,多进程效率更高。
IO密集型任务
:由于多进程的切换开销大于多线程切换开销,而协程根本不存在切换问题。因此对于IO密集型任务来说,在效率上协程>多线程>多进程。
多线程和多进程对比
1. cpu密集型操作,多进程快于多线程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed, ProcessPoolExecutor
def fib(n):
if n <= 2:
return 1
return fib(n - 1) + fib(n - 2)
def multi_thread():
with ThreadPoolExecutor(3) as executor:
all_task = [executor.submit(fib, (num)) for num in range(25, 35)]
start_time = time.time()
for future in as_completed(all_task):
data = future.result()
print("exe result:{}".format(data))
print("last time of multi-threading is: {}".format(time.time() - start_time))
def multi_process():
with ProcessPoolExecutor(3) as executor:
all_task = [executor.submit(fib, (num)) for num in range(25, 35)]
start_time = time.time()
for future in as_completed(all_task):
data = future.result()
print("exe result:{}".format(data))
print("last time of multi-process is: {}".format(time.time() - start_time))
if __name__ == '__main__':
multi_thread()
multi_process()
"""
运行结果:
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 of multi-threading is: 3.717057943344116
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 of multi-process is: 2.2808990478515625
Process finished with exit code 0
"""
2. IO密集型操作,多线程快于多进程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed, ProcessPoolExecutor
def random_sleep(n):
time.sleep(n)
return n
def multi_thread():
with ThreadPoolExecutor(3) as executor:
all_task = [executor.submit(random_sleep, (num)) for num in [2]*30]
start_time = time.time()
for future in as_completed(all_task):
data = future.result()
print("exe result:{}".format(data))
print("last time of multi-threading is: {}".format(time.time() - start_time))
def multi_process():
with ProcessPoolExecutor(3) as executor:
all_task = [executor.submit(random_sleep, (num)) for num in [2]*30]
start_time = time.time()
for future in as_completed(all_task):
data = future.result()
print("exe result:{}".format(data))
print("last time of multi-process is: {}".format(time.time() - start_time))
if __name__ == '__main__':
multi_thread()
multi_process()
"""
运行结果:
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 of multi-threading is: 20.006490230560303
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 of multi-process is: 20.358548641204834
Process finished with exit code 0
"""