[1] - IO密集型
IO密集型,是指运行时大部分情况是 CPU 等待 I/O(硬盘/内存) 的读/写,CPU负载并不高. 一般情况下,由于任务依赖于大量的 I/O 操作,CPU 占用率比较低,没有充分利用 CPU 的处理的能力.
IO 密集型任务,如,涉及网络传输、磁盘读写等场景,其特点时CPU 消耗较少,大部分时间处于等待 I/O 操作,因为 I/O 的速度远低于 CPU 和内存的速度.
IO 密集型任务,任务越多,CPU效率越高. 适合于多线程处理.
[2] - CPU密集型
CPU密集型,也叫计算密集型,是指运行时大部分情况是 CPU 负载为 100%,CPU 读/写的 I/O 操作可以很快完成. 一般而言,可能是由于任务对 I/O 设备访问较少,或者是等待 I/O 的时间被多线程屏蔽,CPU 的占用率很高.
计算密集型任务需要进行大量的计算,依赖于 CPU 资源,如视频解码等.
1. 多线程加速 IO 密集型任务
如,单线程实现:
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import time
def testfun(idx):
with open(str(idx) + ".txt", "w") as fp:
s = ("hello world %d" %idx)*1000000
fp.write(s)
if __name__ == '__main__':
start = time.time()
for idx in range(100):
testfun(idx)
print('timecost: ', time.time() - start)
timecost: 1.4586577415466309
多线程实现:
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import time
import threading
def testfun(idx):
with open(str(idx) + ".txt", "w") as fp:
s = ("hello world %d" %idx)*1000000
fp.write(s)
if __name__ == '__main__':
start = time.time()
thread_list = []
for idx in range(100):
t = threading.Thread(target=testfun,
args=(idx, ))
t.setDaemon(True) #设置为守护线程
thread_list.append(t)
print('timecost: ', time.time() - start)
for t in thread_list:
t.start() #启动线程
for t in thread_list:
t.join() #等待子线程结束
timecost: 0.0008275508880615234
2. 多进程加速 CPU 密集型任务
如,单进程实现:
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import time
def muchjob(x):
time.sleep(5)
return (x**2)
if __name__ == '__main__':
start = time.time()
anns = [muchjob(idx) for idx in range(10)]
print('timecost: ', time.time() - start)
print(anns)
timecost: 50.04609179496765
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
多进程实现:
#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import time
import multiprocessing
data = range(10)
def muchjob(x):
time.sleep(5)
return (x**2)
if __name__ == '__main__':
start = time.time()
pool = multiprocessing.Pool(processes=4)
result = []
for idx in range(10):
result.append(pool.apply_async(muchjob, (idx, )))
pool.close()
pool.join()
ans = [res.get() for res in result]
print('timecost: ', time.time() - start)
print(anns)
timecost: 15.098523378372192
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
3. Related
[1] - 24 个让 Python 加速的好方法
[2] - 什么是CPU密集型、IO密集型?