Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的多线程模块比多处理慢_Python_Multithreading_Algorithm_Parallel Processing_Multiprocessing - Fatal编程技术网

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

python中的多线程模块比多处理慢,python,multithreading,algorithm,parallel-processing,multiprocessing,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.tim

我发现对于同一个任务,线程模块比多重处理花费更多的时间

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秒

并行线程模块中的10个func执行需要: 46秒

并行多处理模块中的10个func执行需要: 7.92秒

1为什么使用多处理模块的实现比使用线程模块的实现效果更好


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

您的两个问题都可以通过以下摘录得到答案:

CPython解释器使用的机制,用于确保一次只有一个线程执行Python字节码。通过使包含关键内置类型(如dict)的对象模型对并发访问具有隐式安全性,从而简化了CPython实现。锁定整个解释器使解释器更容易成为多线程的解释器,而牺牲了多处理器机器提供的大部分并行性

我的。最后,您将花费大量时间在线程之间切换,以确保它们都运行到完成。这就像把一根绳子切成小块,然后再把它们绑在一起,一次一根绳子


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

@AnthonySottile,谢谢,但我的问题要宽泛一点——你的链接问题其实不是——这个问题和几个答案都详细说明了,由于全局解释器锁,对于cpu限制的操作,线程通常会变慢,而且多处理和线程都会有一些启动成本。在这种情况下,线程速度如此缓慢的原因是由于GIL和上下文切换。