我发现线程模块比同一任务的多处理花费更多时间。
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执行需要:
并行执行10个func执行(线程模块):25.66 seconds
46.00 seconds
并行执行10个func执行(多处理模块):7.92 seconds
1)为什么使用多处理模块的实施比使用线程模块更好?
2)为什么一致 func执行比使用线程模块花费更少的时间?
答案 0 :(得分:3)
这两个问题都可以通过docs
的摘录来回答CPython解释器用来确保一次只执行一个Python字节码的机制。这通过制作对象模型(包括关键的内置类型,如dict)简化了CPython实现)隐式安全地防止并发访问。锁定整个解释器使得解释器更容易实现多线程,代价是多处理器机器提供的大部分并行性。
大胆强调我的。您最终会花费大量时间在线程之间切换,以确保它们全部运行完成。这就像把一根绳子切成小块,然后将这些碎片重新绑在一起,一次一根绳子。
多处理模块的结果与预期一致,因为每个进程都在自己的地址空间中执行。除了处于相同的进程组并具有相同的父进程之外,这些进程彼此独立。