场景:一个进程控制吃饭函数,另一个进程控制睡觉函数,同步进行。
结论,运行时间:不用进程 > 函数形式进程 == 类形式进程
目录
2.函数形式进程 multiprocessing.Process()
3.类形式进程 multiprocessing.Process类
1.不用进程
用时:6s
import time
import multiprocessing
def eat(p_name):
for i in range(3):
print(p_name, "eat1")
time.sleep(1)
def sleep(p_name):
for i in range(3):
print(p_name, "sleep2")
time.sleep(1)
if __name__ == '__main__':
start = time.time()
eat("1")
sleep("2")
print(str(round(time.time() - start, 3)) + 's')
输出:
1 eat1
1 eat1
1 eat1
2 sleep2
2 sleep2
2 sleep2
6.043s
2.函数形式进程 multiprocessing.Process()
用时:3s
import time
import multiprocessing
def eat(p_name):
for i in range(3):
print(p_name, "eat1")
time.sleep(1)
def sleep(p_name):
for i in range(3):
print(p_name, "sleep2")
time.sleep(1)
if __name__ == '__main__':
start = time.time()
p1 = multiprocessing.Process(target=eat, args=("p1", ))
p2 = multiprocessing.Process(target=sleep, args=("p2", ))
p1.start()
p2.start()
p1.join()
p2.join()
print(str(round(time.time() - start, 3)) + 's')
输出:
p1 eat1
p2 sleep2
p1 eat1
p2 sleep2
p1 eat1
p2 sleep2
3.086s
3.类形式进程 multiprocessing.Process类
用时:3s
import time
import multiprocessing
def eat(p_name):
for i in range(3):
print(p_name, "eat1")
time.sleep(1)
def sleep(p_name):
for i in range(3):
print(p_name, "sleep2")
time.sleep(1)
class Life(multiprocessing.Process):
def __init__(self, life_type, p_name):
multiprocessing.Process.__init__(self)
self.life_type = life_type
self.p_name = p_name
def run(self):
self.life_type(self.p_name)
if __name__ == '__main__':
start = time.time()
p1 = Life(eat, "p1")
p2 = Life(sleep, "p2")
p1.start()
p2.start()
p1.join()
p2.join()
print(str(round(time.time() - start, 3)) + 's')
p1 eat1
p2 sleep2
p2 sleep2
p1 eat1
p2 sleep2
p1 eat1
3.066s
注:不用多线程的原因:
1. 进程和线程:
操作系统可以同时执行多个任务,每一个任务就是一个进程,进程可以同时执行多个子任务,每一个子任务就是一个线程。
- 当一个进程里只有一个线程时,叫作单线程。超过一个线程就叫作多线程;
- 多个线程共享父进程里的全部资源,会使得编程更加方便;
- 多线程也是并发执行的,即同一时刻,python主程序只允许有一个线程执行,这和全局解释器锁(管理内存引用计数)有关系
2. 全局解释器锁对多线程的影响
首先我们应该区分不同性质的任务,有一些是CPU密集型的任务,有一些是I/O密集型的任务。
- CPU密集型的任务在最大程度上使用了CPU,比如数学矩阵的计算、图像处理、文件解压缩等。
- I/O密集型任务在需要花费很多时间来等待信息的输入和输出(读写),比如从网址下载内容,大量访问磁盘进行读写等。
对于CPU密集型的任务,多线程使用的时间比单线程还多,这就是全局解释器锁带来的问题。但是如果是I/O密集型的任务,全局解释器锁就不会再有这种影响,各个线程在等待I/O的时候可以共享锁。