当前位置: 首页 > 后端技术 > Python

说说python多进程多线程介绍

时间:2023-03-26 17:15:27 Python

进程:为了提高计算机系统的运行效率,增强计算机系统中各种硬件的并行运行能力,操作系统要求程序结构为适应并发处理的需要,即使在计算机系统中。有两个以上的程序同时执行,顺序程序的结构不具备并发处理的能力。因此,为了描述操作系统的并发性,引入了进程的概念。进程是一个可以独立运行并可以与其他程序并行执行活动的单元。在结构上,每个进程由一个程序段(数据)和一个进程控制块PCB组成。在单CPU的情况下,多个进程会通过时间片轮换轮流占用CPU,实现并发。要实现并行性,需要多个CPU。当多个进程轮流占用CPU时,需要进行进程切换。当进程1切换到进程2时,系统需要保留进程1需要的信息。python进程是通过multipassing库创建的。1、启动方式有以下三种:spawn:父进程启动一个新的Python解释器进程。子进程只会继承运行进程对象的run()方法所需的那些资源。特别是,不继承父进程的非必要文件描述符和句柄。与使用fork或forkserver相比,使用此方法启动进程非常慢。fork:父进程使用os.fork()来forkPython解释器。子进程在开始时实际上与父进程相同。父进程的所有资源都被子进程继承。请注意,安全地分叉多线程进程是很棘手的。仅存在于Unix上。Unix中的默认值。forkserver:程序启动时会启动server进程,选择forkserver启动方式。从此以后,每当需要一个新进程时,父进程就会连接到服务器并要求它派生一个新进程。分叉的服务器进程是单线程的,因此使用os.fork()是安全的。没有不必要的资源被继承。在Unix平台上可用,它支持通过Unix管道传递文件描述符。2、multiprocessing支持的进程间通信有两个队列:使用Queue类,它是一个类似于queue的克隆。QueuefrommultiprocessingimportProcess,Queuedeffunc(q):q.put(["python","Process"])if__name__=='__main__':q=Queue()p=Process(func,args=(q,)p.start()print(q.get())#prints'["python","Process"]'p.join()队列是线程和进程安全的管道:Pipe()函数返回一个由管道连接的连接对象,默认情况下是双工的frommultiprocessingimportProcess,Pipedeffunc(conn):conn.send(["python","Process"])conn.close()if__name__=='__main__':parent_conn,child_conn=Pipe()p=Process(func,args=(child_conn,)p.start()print(parent_conn.recv())#prints'["python","Process"]'p.join()返回的两个连接对象Pipe()代表管道的两端,每个连接对象都有send()和revc()方法。请注意:如果两个进程或线程尝试在管道的同一端写入或读取同时,管道中的数据可能已损坏。当然,如果不同的工艺同时使用管道的不同端头就不会存在损坏的风险。孤儿进程:在多进程环境下,父进程先退出,而它的子进程还在运行,那么这些子进程就会成为孤儿进程。孤儿进程将被init进程(进程号1)回收。僵尸进程:一个进程使用fork创建一个子进程。如果子进程退出,父进程没有调用wait或waitpid获取子进程的状态信息,系统中仍然保存着子进程的进程描述符。清除僵尸进程的方法:1.结束父进程,父进程结束子进程也会结束,但是这样比较暴力,因为我们还需要父进程继续运行。2.通过wait调用读取子进程的退出状态。比如multiprocess.Process生成的进程可以通过子进程的join()方法进行等待,或者在父进程中处理SIGCHLE信号,在handler中调用wai系统调用或者直接设置为SIG_IGN来清除僵尸进程。3.就是把子进程变成孤儿进程线程。引入线程是因为多进程切换的开销比较大。线程是比进程更小,可以独立运行的基本单元。它试图通过线程来提高系统中程序的并发执行效率。由于进程是资源拥有者,系统必须在创建、撤销、切换等动作中付出大量的时间和空间开销。因此,不宜在系统中设置过多的进程。这也限制了并发度的进一步提高。人们把进程分别作为资源分配单位和调度单位,即进程仍然是资源分配的基本单位,但不是调度的基本单位(很少调度或切换),调度执行和调度的责任切换到线程。这样就形成了线程的概念。线程是一个轻量级进程,是系统独立调度调度的基本单元。线程本身不拥有系统资源,只拥有运行所必需的少数资源。但是,它可以与属于同一进程的其他线程共享进程。拥有的所有资源。在python中,线程是通过线程库生成的fromthreadingimportThreaddeffunc():print("-----")if__name__=='__main__':t=Thread(func)t.start()