13.二、进程的通讯:Queue、Pipe、


内容相关:

概念:进程的通讯socket

Queue:建立与使用spa

Pipe:建立与使用code


进程通讯的概念

  • 进程的资源空间是相互独立的,通常而言是不能相互访问的。但不少状况下进程间须要互相通讯,来完成系统的某项功能。进程经过与内核及其它进程之间的互相通讯来协调它们的行为。
  • 通讯方法:
    • 数据传输:一个进程将它的数据发送给另外一个进程【如socket通常,把须要通讯的数据传输给对方】
    • 管道:使用一片独立的区域【不在双方的资源空间中】,像一个有两个口的仓库同样,厂家负责在东门把产品放到仓库,司机负责在西门拉走产品
    • 资源共享:约定一片区域,双方均可以随意取放
    • 消息队列:这也是一个独立的区域,足够权限的进程能够向队列中添加消息,被赋予读权限的进程则能够读走队列中的消息

 


Queue:

  • 能够使用队列multiprocessing.Queue来进行进程通讯

Queue 在multiprocessing 模块中:from multiprocessing import Queue对象

  • Queue的使用:
    • 1.建立对象:Queue对象=Queue()
    • 2.传入对象:要在主进程外使用Queue对象,须要做为参数传入image
    • 3.操做对象:【获取元素:Queue对象.get()】、【放入元素:Queue对象.put(元素)】
#Queue在multiprocessing中
from multiprocessing import  Queue,Process

def f(q):#要在主进程外使用,须要做为参数传入
    q.put(['helloworld'])
    

def m(q):
    print("get in p2:",q.get())

if __name__=="__main__":
    q=Queue()
    p=Process(target=f,args=(q,))
    p.start()
    p2=Process(target=m,args=(q,))
    p2.start()


Pipe:

  • 能够使用管道Pipe来进行进程通讯

Pipe 在multiprocessing 模块中:from multiprocessing import Pipeblog

  • Pipe的使用:
    • 1.建立对象:第一个Pipe对象,第二个Pipe对象=Pipe(),返回两个对象,第一个对象只能发,第二个对象只能收
    • 2.传入对象:在要发送的进程,传入第一个Pipe对象;在要接收的进程,传入第二个Pipe对象image
    • 3.操做对象:【获取元素:第一个对象.recv()】、【放入元素:第二个对象.send(元素)】
    • 4.操做完成后关闭管道:第一个对象.close(),第一个对象.close()
from multiprocessing import Pipe,Process

def f(conn):
    a=[1,2,3,4]
    conn.send(a)
    conn.close()
def m(conn):
    a=conn.recv()
    conn.close()


if __name__=="__main__":
    parent_conn,child_conn=Pipe()#返回两个值,第一个只能发,第二个只能收
    p1=Process(target=f,args=(child_conn,))
    p2 = Process(target=m, args=(parent_conn,))#
    p1.start()
    p2.start()
    p1.join()
    p2.join()
相关文章
相关标签/搜索