import multiprocessing import time import os import random g_nums = [11, 22, 33] def test1(): while True: print("子进程PID = %d,父进程PID = %d" % (os.getpid(), os.getppid())) time.sleep(1) def test2(a, b, c, *args, **kwargs): print(a) print(b) print(c) print(args) print(kwargs) def test3(): global g_nums g_nums.append(44) print("test3:", end="") print(g_nums) def test4(): global g_nums print("test4:", end="") print(g_nums) def download_from_web(q): """ 下载数据 """ # 模拟从网上下载数据 data = [11, 22, 33, 44] # 向队列中写入数据 for temp in data: q.put(temp) print("下载器已经下载完了数据,并存入到了队列中!") def analysis_data(q): """ 数据处理 """ wait_analysis_data = list() while True: data = q.get() wait_analysis_data.append(data) if q.empty(): break print("模拟数据处理:" + str(wait_analysis_data)) def work(msg): t_start = time.time() print("%d开始执行,进程PID:%d" % (msg, os.getppid())) # random.random()随机生成0~1之间的浮点数 time.sleep(random.random() * 2) t_stop = time.time() print("%d执行完毕,耗时%0.2f" % (msg, t_stop - t_start)) def main(): print("主进程PID = %d,父进程PID = %d" % (os.getpid(), os.getppid())) # 创建一个队列 q = multiprocessing.Queue() # 定义一个进程池,最大进程数3 po = multiprocessing.Pool(3) p1 = multiprocessing.Process(target=test1) p2 = multiprocessing.Process(target=test2, args=(11, 22, 33, 44, 55, 66, 77), kwargs={"籍贯": "常山", "姓名": "赵子龙"}) p3 = multiprocessing.Process(target=test3) p4 = multiprocessing.Process(target=test4) # 创建多个进程,将队列的引用当做实参传递到里面 p5 = multiprocessing.Process(target=download_from_web, args=(q,)) p6 = multiprocessing.Process(target=analysis_data, args=(q,)) # p1.start() # p2.start() # # 进程3 和 进程4 说明:多进程之间不共享全局变量 # p3.start() # p4.start() # # 进程5 和 进程6 演示了多进程之间通过Queue 来实现数据共享 # p5.start() # p6.start() for i in range(1, 11): # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,)) # 每次循环将会用空闲出来的子进程去调用目标 po.apply_async(work, args=(i,)) print("------start------") # 关闭进程池,关闭后po不再接收新的请求 po.close() # 等待po中所有子进程执行完成,必须放在close语句之后 po.join() print("------end------") if __name__ == '__main__': main()