1. 多线程threading
import timefrom threading import Threaddef thread_read(data):while True:print('read data:', data)def thread_write(data):i = 1while True:data[0] = idata[1] = i + 1print('write data:', data)i += 1if __name__ == '__main__':data = [0, 0]t = Thread(target=thread_read, args=(data,))t.setDaemon(True)t.start()t2 = Thread(target=thread_write, args=(data,))t2.setDaemon(True)t2.start()while True:print('main')
资源监视器及部分命令行窗口运行结果如下图,只有一个Python进程。
2. 多进程multiprocessing(共享数据失败)
from multiprocessing import Processimport timedef process_write(data):i = 1while True:data[0] = idata[1] = i + 1print('write data: ', data)i += 1def process_read(data):while True:print('read data: ', data)if __name__=='__main__':data = [0, 0]p1 = Process(target=process_write, args=(data,))p2 = Process(target=process_read, args=(data,))p1.start()p2.start()while True:print('main process')
资源监视器及部分命令行窗口运行结果如下图,有三个Python进程。
3. threading和multiprocessing的区别
threading是开启线程,只有一个进程,并且线程间共享数据正常,但是在多核CPU电脑运行时并没有真正并行。
multiprocessing是开启进程,多个进程,并且共享数据失败(进程共享数据),而且在多核CPU电脑上能实现真正的并行运行。
我们添加点代码,让多线程和多进程都执行1秒钟,查看写进程的数据达到了多少,代码和最终运行结果如下。
这边可以看到6932和3791,并不是完全差3倍。主要有两方面,一方面是我们主线程和主进程1秒结束,并不是真正的1秒,多线程下主线程会被抢资源,所以等到它抢到资源时,时间不一定是完全1秒钟。另一方面,即使是多进程,如果被分配在同一颗CPU上,那么还是存在资源竞争的。只是整体比多线程更接近并行运行。