《大数据的Python基础》课件_第12章 并发编程.pptx
第12章并发编程
学习目标掌握进程的执行、同步与数据交换掌握线程的创建与同步方法深入了解协程的概念和使用方法22025/3/6
12.1进程进程是操作系统中正在执行程序的实例,具有独立的地址空间,保存了执行指令、变量、动态分配的内存以及堆栈数据空间等。32025/3/6
12.1.1进程的执行传统的批处理系统采用串行的方式执行程序,一个任务执行完了再启动下一个任务。并发执行的操作系统允许多个任务同时执行,如果涉及CPU占用等受限资源的使用,会使用调度算法实现多任务之间的共享。在Python程序启动后,会默认产生一个进程作为主进程,若在程序中启动一个进程,事实是启动了当前进程的子进程。子进程采用start()方法启动执行,而其执行是否结束可以由join()方法来确定,子进程join()方法一旦被执行,会确保该进程一定执行完成后才能执行后续的指令。42025/3/6
【例12-1】子进程的启动和执行importmultiprocessingasmpimportosimporttimex=100deftask(msg): print(intask,子进程runing) print(intask,modulename:,__name__) print(intask,msg) globalx x=10 time.sleep(2)print(intask,parentprocess:,os.getppid()) #查看父进程IDprint(intask,processid:,os.getpid()) #查看当前进程IDprint(intask,x=,x)52025/3/6if__name__==__main__: p=mp.Process(target=task,args=(MySubProcess,)) p.start() p.join() #等待子进程执行完毕 print(x=,x) print(parentprocess:,os.getppid())#查看父进程ID print(processid:,os.getpid()) #查看当前进程ID
【例12-1】子进程的启动和执行对于进程的执行不能在IDLE环境中进行,否则无法准确观察结果。以上的程序需要在命令行中执行,如图所示。在一个程序中,若同时存在多个任务,可以利用进程池并发执行各个任务。62025/3/6
【例12-2】利用进程池执行多个序列元素的乘积importmultiprocessingasmpimportosfromfunctoolsimportreducedeff(lst): print(name={}ppid={}pid={}.format(mp.current_process().name, os.getppid(),os.getpid())) return(reduce(lambdax,y:x*y,lst))if__name__==__main__: x=[list(range(x,x+9))forxinrange(1,100,10)] #list(range(1,9)),list(range(10,19))… withmp.Pool(os.cpu_count())asp: print(p.map(f,x))72025/3/6
【例12-2】利用进程池执行多个序列元素的乘积 程序执行结果中的计算结果唯一,但结果中参与计算的进程信息每次运行会出现不同的信息,由于x中总共有10个元素,因此其打印的数量为10个记录。 根据进程号可以看出,当前有三个子进程4152、4896、6600,一个父进程9496,最后10组列表各自元素的累积则放在一个列表中打印出来:82025/3/6
【例12-2】利用进程池执行多个序列元素的乘积92025/3/6name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-1ppid=9496pid=4152name=SpawnPoolWorker-2