python 进程
1. 使用进程实现多任务
import time import multiprocessing def test1(): while True: print("1--------") time.sleep(1) def test2(): while True: print("2--------") time.sleep(1) def main(): p1 = multiprocessing.Process(target=test1) p2 = multiprocessing.Process(target=test2) p1.start() p2.start() if __name__ == "__main__": main()
2. 获取进程的ID
import multiprocessing import os import time def test(): while True: print("----in 子进程 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid())) time.sleep(1) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test) p.start() if __name__ == "__main__": main()
3. 进程的运行顺序
import multiprocessing import os import time def test(): while True: print("----in 子进程 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid())) time.sleep(1) def test2(): while True: print("----in 子进程2 pid=%d ,父进程的pid=%d---" % (os.getpid(), os.getppid())) time.sleep(1) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test) p.start() p2 = multiprocessing.Process(target=test2) p2.start() if __name__ == "__main__": main()
4. 给Process传递参数
import multiprocessing import os import time def test(a, b, c, *args, **kwargs): print(a) print(b) print(c) print(args) print(kwargs) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test, args=(11, 22, 33, 44, 55, 66, 77, 88), kwargs={"mm":11}) p.start() if __name__ == "__main__": main()
5. 多进程之间不共享全局变量
import multiprocessing import os import time nums = [11, 22, 33] def test(): nums.append(44) print("在进程中1中nums=%s" % str(nums)) time.sleep(3) def test2(): print("在进程中2中nums=%s" % str(nums)) def main(): print("----in 主进程 pid=%d---父进程pid=%d----" % (os.getpid(), os.getppid())) p = multiprocessing.Process(target=test) p.start() # time.sleep(1) p.join() p2 = multiprocessing.Process(target=test2) p2.start() if __name__ == "__main__": main()
6. 多进程之间通过Queue来实现数据共享
import multiprocessing """ 一个进程向Queue中写入数据,另外一个进程从Queue中获取数据, 通过Queue完成了 多个需要配合的进程间的数据共享,从而能够 起到 解耦的作用 """ def download_from_web(q): """下载数据""" # 模拟从网上下载的数据 data = [11, 22, 33, 44] # 向队列中写入数据 for temp in data: q.put(temp) print("---下载器已经下载完了数据并且存入到队列中----") def analysis_data(q): """数据处理""" waitting_analysis_data = list() # 从队列中获取数据 while True: data = q.get() waitting_analysis_data.append(data) if q.empty(): break # 模拟数据处理 print(waitting_analysis_data) def main(): # 1. 创建一个队列 q = multiprocessing.Queue() # 2. 创建多个进程,将队列的引用当做实参进行传递到里面 p1 = multiprocessing.Process(target=download_from_web, args=(q,)) p2 = multiprocessing.Process(target=analysis_data, args=(q,)) p1.start() p2.start() if __name__ == "__main__": main()
7. 进程池
# -*- coding:utf-8 -*- from multiprocessing import Pool import os, time, random def worker(msg): t_start = time.time() print("%s开始执行,进程号为%d" % (msg,os.getpid())) # random.random()随机生成0~1之间的浮点数 time.sleep(random.random()*2) t_stop = time.time() print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start)) po = Pool(3) # 定义一个进程池,最大进程数3 for i in range(0,10): # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,)) # 每次循环将会用空闲出来的子进程去调用目标 po.apply_async(worker,(i,)) print("----start----") po.close() # 关闭进程池,关闭后po不再接收新的请求 po.join() # 等待po中所有子进程执行完成,必须放在close语句之后 print("-----end-----")