AIHGF

Python - 多线程多进程代码加速
[1] - IO密集型IO密集型,是指运行时大部分情况是 CPU 等待 I/O(硬盘/内存) 的读/写,CPU负载...
扫描右侧二维码阅读全文
25
2019/07

Python - 多线程多进程代码加速

[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

Python - 多线程处理multithreading - AIUAI

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]

Python - 多进程下载multiprocessing - AIUAI

3. Related

[1] - 24 个让 Python 加速的好方法

[2] - 什么是CPU密集型、IO密集型?

Last modification:July 25th, 2019 at 09:18 pm

Leave a Comment