多线程模块比python中的多处理慢

时间:2017-07-02 14:25:55

标签: python multithreading algorithm parallel-processing multiprocessing

我发现线程模块比同一任务的多处理花费更多时间。

import time
import threading
import multiprocessing

def func():
    result = 0
    for i in xrange(10**8):
        result += i

num_jobs = 10


# 1. measure, how long it takes 10 consistent func() executions 
t = time.time()
for _ in xrange(num_jobs):
    func()
print ("10 consistent func executions takes:\n{:.2f} seconds\n".format(time.time() - t))        

# 2. threading module, 10 jobs
jobs = []
for _ in xrange(num_jobs):
    jobs.append(threading.Thread(target = func, args=()))
t = time.time()
for job in jobs:
    job.start()
for job in jobs:
    job.join()      
print ("10 func executions in parallel (threading module) takes:\n{:.2f} seconds\n".format(time.time() - t))        

# 3. multiprocessing module, 10 jobs
jobs = []
for _ in xrange(num_jobs):
    jobs.append(multiprocessing.Process(target = func, args=()))
t = time.time()
for job in jobs:
    job.start()
for job in jobs:
    job.join()
print ("10  func executions in parallel (multiprocessing module) takes:\n{:.2f} seconds\n".format(time.time() - t))  

结果:

  

10个一致的func执行需要:   25.66 seconds

     并行执行10个func执行(线程模块):   46.00 seconds

     并行执行10个func执行(多处理模块):   7.92 seconds

1)为什么使用多处理模块的实施比使用线程模块更好?

2)为什么一致 func执行比使用线程模块花费更少的时间?

1 个答案:

答案 0 :(得分:3)

这两个问题都可以通过docs

的摘录来回答
  

CPython解释器用来确保一次只执行一个Python字节码的机制。这通过制作对象模型(包括关键的内置类型,如dict)简化了CPython实现)隐式安全地防止并发访问。锁定整个解释器使得解释器更容易实现多线程,代价是多处理器机器提供的大部分并行性。

大胆强调我的。您最终会花费大量时间在线程之间切换,以确保它们全部运行完成。这就像把一根绳子切成小块,然后将这些碎片重新绑在一起,一次一根绳子。

多处理模块的结果与预期一致,因为每个进程都在自己的地址空间中执行。除了处于相同的进程组并具有相同的父进程之外,这些进程彼此独立。