讲解多线程之际, 介绍出达成线程间通信的三种机制, 同样还给出多种实现进程间通信的机制, 主要存在以下两种, 模块下的Queue类可供多个进程之间去得以实现。
在对多线程予以讲解之际, 介绍了三种达成线程间通信的机制, 同样地, 也给出了多种达成进程间通信的机制, 主要涵盖以下两种: 模块之下的Queue类, 给出了多个进程之间用以达成通信的诸多办法;Pipe, 又被称作“管道”, 常常被用于达成两个进程之间的通信, 这两个进程分别处于管道的两端。
在后续阶段那将会针对以上所提到的两种方式其相应的具体实现展开极为详尽的讲解。对于Queue实现进程间通信而言, 在之前已经讲解过运用Queue模块当中的Queue类去达成线程间通信, 然而若要实现进程间通信的话, 就需要运用模块当中的Queue类。
对于 Queue 实现进程间通信这种方式, 较为简易的理解是, 它运用了操作系统所开辟的一个用于队列的空间, 各个进程能够将数据放置到这个队列里, 并且, 也能够从队列之中把自身所需的信息取出来。
实现进程间通信具有诸多方法, 这些方法由 Queue 类提供, 表 1 所罗列的是常用的其中一些方法。
把表1中, Queue类常用的那个, 名为put(obj的方法名, 所具有的功能, 进行表述。
,block=True
,=None
将obj放进队列,当中倘若block参数被设为True时, 一旦队列被写满, 那么代码就会被阻塞, 直至有进程取走数据并腾出空间以供obj使用。参数用于设置阻塞的时间, 也就是程序最多在阻塞数秒之后, 如果依旧没有空闲空间, 那么程序会抛出queue.Full异常。(obj)此方法的功能等同于put(obj, False)。get。
block=True ,
=None
通过队列获取数据并加以返回, 当block取值为True且某值为None之际, 此方法会致使当前进程处于阻塞状态, 直至队列存有可使用的数据。要是将block设置为False, 进程会径直开展取数据的行为, 倘若取数据遭遇失败状况, 便会抛出queue.Empty异常(在此种情形下某参数将不产生作用)。若手动设定秒数, 当前进程在至多被阻塞该设定的秒数时长后, 要是届时仍旧未能取出可用的数据, 就会抛出queue.Empty异常。该方法的功能和 get(False) 是一样的。empty() 这个操作是用来判定当下队列空间是不是空的, 要是空的话, 那该方法就返回 True;反过来讲, 如果不是空的, 那就返回 False。
下面的程序, 进行了演示, 演示的内容是, 怎样去使用Queue类, 达成多进程相互之间通信的结果。
import multiprocessing def processFun(queue,name): print(multiprocessing.current_process().pid,"进程放数据:",name) #将 name 放入队列 queue.put(name) if __name__ == '__main__': # 创建进程通信的Queue queue = multiprocessing.Queue() # 创建子进程 process = multiprocessing.Process(target=processFun, args=(queue,"http://c.biancheng.net/python/")) # 启动子进程 process.start() #该子进程必须先执行完毕 process.join() print(multiprocessing.current_process().pid,"取数据:") print(queue.get())程序执行结果为:
27100 进程放数据:
24188 取数据:
管或管道是 Pipe 直译过来的意思, Pipe 是实现进程间通信, 该种实现多进程编程的方式, 其和实际生活中的管即管道是非常类似的。通常情况下, 管道有两个口, 而 Pipe 也常被用于实现两个进程两两之间的通信, 这两个进程就是分别处于管道的两端, 一端是用作发送数据的, 另一端则是用来接收数据的。
要借助 Pipe 达成进程通信这件事儿, 起初, 得去调用那个.Pipe() 函数哩, 以此创造出一个管道, , 该函数用到的语法形式是下面这样的:
conn1, conn2 = .Pipe(
=True
当中, conn1以及conn2分别是用以接收Pipe函数返回的那2个端口的;参数其默认状态为True, 这意味着该管道是双向的, 也就是处于两个端口的进程, 既能进行数据发送, 又能实施数据收发, 然而要是把值设置成False, 那就表明管道是单向的, conn1仅仅能够用来接收数据, 并且conn2仅仅能够用来发送数据。
除此之外应值得提及的是, conn1属于对象, conn2属于对象, conn1能够调用表2所显示的这些方法, conn2能够调用表2所显示的这些方法。
表2中, Pipe对象能调用的方法众多, 其中, 方法名是send(obj)的这个方法, 其功能为发送一个obj给管道的另一端, 而另一端要使用recv()方法来接收才行。要知晓的是, 该obj必须是能够被序列化的, 要是该对象序列化之后超出了32MB, 那么很有可能就会引发异常。另外, 名为recv()的方法, 其作用是接收另一端借助send()方法发送过来的数据。还有close()方法, 它的功能是关闭连接。另外pol()方法, 它返回的是连接里是不是还有数据能够去读取。()方法则是用于发送字节数据的。要是没指定 、size 参数, 那默认发送 字节串之全部数据;要是指定了 和 size 参数, 那就只发送 字节串里从 起始、长度为 size 的字节数据。经由此方法发送的数据, 得用 () 或 方法去接收。
获取经由()方式传递过来的数据, 明确规定最多所能接收的字节数量。此方法会返回接收到的字节形式的数据。()具备的功能跟()方法相类似, 仅仅是该方法会把接收到的数据放置于 里面。
下面的程序, 进行了演示, 演示的内容为, 怎样去使用, 使用 Pipe 管道, 来实现, 实现 2 个进程, 之间通信。
import multiprocessing def processFun(conn,name): print(multiprocessing.current_process().pid,"进程发送数据:",name) conn.send(name) if __name__ == '__main__': #创建管道 conn1,conn2 = multiprocessing.Pipe() # 创建子进程 process = multiprocessing.Process(target=processFun, args=(conn1,"http://c.biancheng.net/python/")) # 启动子进程 process.start() process.join() print(multiprocessing.current_process().pid,"接收数据:") print(conn2.recv())程序执行结果为:
28904 进程发送数据:
28880 接收数据: