2022-05-07 22:17:00 by wst
python高级在实际编程中,为了提高程序的执行速度,我们会采用多进程编程。
from multiprocessing import Process
import time
import os
class SubProcess(Process):
def __init__(self, interval, name='') -> None:
Process.__init__(self)
self.interval = interval
if name:
self.name = name
def run(self):
print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
t_start = time.time()
time.sleep(self.interval)
t_stop = time.time()
print("子进程(%s)执行结束,耗时%0.2f秒" % (os.getpid(), t_stop - t_start))
def child_1(interval):
print("子进程(%s)开始执行,父进程为(%s)"%(os.getpid(), os.getppid()))
t_start = time.time()
time.sleep(interval)
t_end = time.time()
print("子进程(%s)执行时间为'%0.2f'秒"%(os.getpid(), t_end - t_start))
def child_2(interval):
print("子进程(%s)开始执行,父进程为(%s)" % (os.getpid(), os.getppid()))
t_start = time.time()
time.sleep(interval)
t_end = time.time()
print("子进程(%s)执行时间为'%0.2f'秒" % (os.getpid(), t_end - t_start))
if __name__ == "__main__":
print("------------父进程开始执行----------------")
print("父进程PID:", os.getpid())
p1 = Process(target=child_1, args=(1,))
p2 = Process(target=child_2, name="demotech", args=(2,))
p3 = SubProcess(interval=1, name='todaysoft')
p4 = SubProcess(interval=2)
p1.start()
p2.start()
# 对一个不包含target属性的Process类,执行start()方法,就会调用这个类中的run()方法
p3.start()
p4.start()
print("p1.name=", p1.name, "\tp1.pid=", p1.pid)
print("p2.name=", p2.name, "\tp2.pid=", p2.pid)
print("p3.name=", p3.name, "\tp3.pid=", p3.pid)
print("p4.name=", p4.name, "\tp4.pid=", p4.pid)
print("----------等待子进程----------")
p1.join()
p2.join()
p3.join()
p4.join()
print("-----------父进程执行结束-------")
由于内存或CPU的限制,同一时间有时不能并发太多进程,此时可采用进程池的方式。
from multiprocessing import Pool
import time
import os
def task(name):
print("子进程(%s) 执行task %s ..." % (os.getpid(), name))
time.sleep(1)
if __name__ == "__main__":
print("父进程(%s)." % os.getpid())
p = Pool(3) # 定义一个进程池,最大进程数3
for i in range(10): # 从0开始循环10次
p.apply_async(task, args=(i,)) # 使用非阻塞方式调用task函数
print("等待所有子进程结束")
p.close() # 关闭进程池,关闭后p不再接收新请求
p.join() # 等待子进程结束
print("所有子进程结束。")
输出:
父进程(120594).
等待所有子进程结束
子进程(120595) 执行task 0 ...
子进程(120596) 执行task 1 ...
子进程(120597) 执行task 2 ...
子进程(120595) 执行task 3 ...
子进程(120596) 执行task 4 ...
子进程(120597) 执行task 5 ...
子进程(120596) 执行task 6 ...
子进程(120595) 执行task 7 ...
子进程(120597) 执行task 8 ...
子进程(120595) 执行task 9 ...
所有子进程结束。
可以看出120595,120596,120597三个进程执行了10个任务。