python提供了一个跨平台的多进程支持——multiprocessing模块,其包含process类来代表一个进程对象
1、process语法结构:(注: 传参的时候一定使用关键字传参)
# 自定义进程类 class processclass(process): g_num = 100 def __init__(self, interval): # 这行代码必须添加上 super().__init__() self.interval = interval self.result = "初始化" def run(self): global g_num g_num = 120 print("子进程{},开始执行,父进程为{}".format(os.getpid(), os.getppid())) start = time.time() time.sleep(2) stop = time.time() print("{}执行结束,耗时{:0.2f}秒".format(os.getpid(), stop-start)) self.result = "运行之后的结果" if __name__ == "__main__": t_start = time.time() print("当前进程{}".format(os.getpid())) p = processclass(2) p.start() p.join() t_stop = time.time() # 数据隔离 print("子进程 任务 运行结果:", p.result) # -----> 初始化 数据未改变 print(processclass.g_num) # ------>100 数据未改变 print("(%s)执行结束,耗时%0.2f" % (os.getpid(), t_stop - t_start))
实例如下:
# 自定义进程类 class processclass(process): g_num = 100 def __init__(self, interval, q): # 这行代码必须添加上 super().__init__() self.interval = interval self.result = "初始化" # 初始化一个队列实例化对象 self.q = q def run(self): global g_num g_num = 120 print("子进程{},开始执行,父进程为{}".format(os.getpid(), os.getppid())) start = time.time() time.sleep(self.interval) stop = time.time() print("{}执行结束,耗时{:0.2f}秒".format(os.getpid(), stop-start)) self.result = "运行之后的结果" # 将消息(数据)添加到队列中 self.q.put(g_num) self.q.put(self.result) def get_data(self): return self.result if __name__ == "__main__": # 初始化一个队列实例化对象,参数为队列的长度 queues = queue(5) print("当前进程{}".format(os.getpid())) p = processclass(2, queues) t_start = time.time() p.start() p.join() t_stop = time.time() # 数据隔离 print("子进程 任务 运行结果:", p.get_data()) # -----> 初始化 数据未改变 print(processclass.g_num) # ------>100 数据未改变 print("子进程 任务 运行结果:", queues.get()) # -----> 120 数据未改变 print("子进程 任务 运行结果:", queues.get()) # -----> 运行之后的结果 数据未改变 print("(%s)执行结束,耗时%0.2f" % (os.getpid(), t_stop - t_start))
# 进程池 def worker(msg): start = time.time() print("{}开始执行,进程号为{}".format(msg, os.getpid())) # random.random()生成0~1之间的随机数 time.sleep(random.random()*3) # time.sleep(3) stop = time.time() print(msg, "执行完毕,耗时{:.2f}".format(stop-start)) if __name__ == "__main__": # 定义一个进程池,最大数为3 po = pool(3) for i in range(10): # 非阻塞式操作pool.apply_async(要调用的目标,(传递给目标的参数元组,)) # 每次循环将会用空闲出来的子进程去调用目标 po.apply_async(worker, (i, )) # 阻塞式操作 # po.apply(worker, (i, )) print("start".center(24, "-")) po.close() po.join() print("end".center(24, "-"))
如对本文有疑问, 点击进行留言回复!!
Asp.Net Core Identity 骚断腿的究极魔改实体类
你一定看得懂的 DDD+CQRS+EDA+ES 核心思想与极简可运行代码示例
网友评论