擅长:python、mysql、java
<p>多线程不太适合执行纯CPU密集型的函数。如果这样的函数永远不会产生CPU(例如,对于某种类型的I/O),它们只会“锁定”单个CPU,而您将不会获得任何好处。这就是多处理发挥作用的地方。即使这样,您也需要小心,因为如果您的函数是短期的,那么创建单独进程的开销可能会超过您可能期望的优势。下面是一个多处理的示例。使用变量iter和PROCS来查看行为是如何变化的,你就会明白这一点。函数(myFunc)只是执行任意伪随机计算并构建一个要返回的列表</p>
<pre><code>from datetime import datetime
from multiprocessing import Pool
import math
import random
ITERS = 100_000
PROCS = 100
def myFunc(r):
return [(math.sqrt(random.randint(1, 2000))**2)**(1 / 3) for _ in range(r)]
if __name__ == '__main__':
_start = datetime.now()
with Pool() as pool:
for p in [pool.apply_async(func=myFunc, args=(ITERS,))
for _ in range(PROCS)]:
p.wait()
_end = datetime.now()
print(f'Multi-processing duration={_end-_start}')
_start = datetime.now()
for I in range(PROCS):
myFunc(ITERS)
_end = datetime.now()
print(f'Single-threaded duration={_end-_start}')
</code></pre>
<p>在我的机器上,ITERS和PROCS的值如代码所示,输出如下:-</p>
<p>多处理持续时间=0:00:01.526478<br/>
单线程持续时间=0:00:09.776963</p>