1、什么是进程?
进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。
2、一个简单的进程示例
from multiprocessing import Process import time def process1(): for i in range(5): print(f"进程1的第{i}次循环") time.sleep(0.1) def process2(): for i in range(5): print(f"进程2的第{i}次循环") time.sleep(0.1) if __name__ == '__main__': p1 = Process(target=process1, name="紫禁城1") # 创建进程 p2 = Process(target=process2, name="紫禁城2") p1.start() # 启动进程 p2.start()
开启多个进程,同时执行多个任务,Process()函数的参数:target指定进程执行的函数,name指定进程的名字,args=(参数, )指定给进程函数的参数,args必须是元组,进程函数的参数放在元组里面
3、进程池的使用
from multiprocessing import Process, Pool import time def process1(num): for i in range(20): print(f"进程{num}的第{i}次循环") time.sleep(0.5) return num def alert(num): print(f"进程{num}完毕~~~~~~~~~~") if __name__ == '__main__': num_list = [i for i in range(5)] pool = Pool(5) # 指定进程池进程数量,默认为4 for num in num_list: # 创建同步进程任务,进城一个接一个的执行 # pool.apply(process1, (num, )) # 创建异步进程任务, 参数1:进程调用的函数,参数2:给进程函数的参数,参数3:进程结束时的回调函数,接收进程函数的返回值作为参数 pool.apply_async(process1, (num, ), callback=alert) pool.close() # 关闭进程池,关闭后无法给进程池添加进程了 pool.join() # 阻塞,知道所有进程执行完毕后程序才执行完毕
进程池用于同一个函数多次调用时使用,close()方法用于关闭进程池,关闭后无法再添加进程到进程池,join()方法用于阻塞主进程,直到所有子进程执行完毕之后主进程才能执行完毕
4、进程间通信
from multiporcessing import Queue def getData(q): for i in range(5): q.put(i) print('put') print('爬取完毕') def process_data(q): for i in range(5): r = q.get() print('get') print('处理完毕') if __name__ == '__main__': q = multiprocessing.Queue(2) p1 = multiprocessing.Process(target=getData, args=(q,)) p2 = multiprocessing.Process(target=process_data, args=(q,)) p1.start() p2.start()
进程间通信是通过队列来实现的,使用的是Queue()方法创建队列,可设置参数指定队列的大小,put()方法将数据入队,get()方法从队列中取出数据