进程间通讯

进程队列

import multiprocessing
import time

def foo(q):
    time.sleep(1)
    q.put(12)
    q.put("ss")

if __name__ == '__main__':
    q = multiprocessing.Queue()    #进程队列
    #q = queue.Queue()   线程队列

    p = multiprocessing.Process(target=foo,args=(q,))   #进程和线程不同,资源是不共享的,需要把进程队列传到另一进程中
    p.start()
    print(q.get())
    print(q.get())

管道

import multiprocessing

def f(conn):
    conn.send([11,{"name":"ss"}])
    response = conn.recv()
    print("response:",response)
    conn.close()
    print("q_ID2:", id(conn))


if __name__ == '__main__':
    parent_conn,child_conn = multiprocessing.Pipe()   #双向管道

    print("q_ID1:",id(child_conn))
    p = multiprocessing.Process(target=f,args=(child_conn,))
    p.start()
    print(parent_conn.recv())
    parent_conn.send("hello")
    p.join()

Manager

Queue和Pipe只是实现的进程之间的数据交互,没有实现数据共享,Manager可以实现一个进程取修改另一个进程的数据

import multiprocessing

def f(d,l,i):
    d[i]="ss"
    d["yy"] = 2
    l.append(i)


if __name__ == '__main__':
    with multiprocessing.Manager() as manager:
        d = manager.dict()        #创建字典,不能直接用dict创建,需要用Manager这个是属性
        l = manager.list(range(5))

        p_list = []
        for i in range(10):
            p = multiprocessing.Process(target=f,args=(d,l,i))
            p.start()
            p_list.append(p)

        for s in p_list:
            s.join()

        print(d)
        print(l)

进程同步

import multiprocessing

def f(l,num):
    l.acquire()
    print("%s hello" %num)
    l.release()

if __name__ == '__main__':
    lock = multiprocessing.Lock()

    for i in range(10):
        p = multiprocessing.Process(target=f,args=(lock,i))
        p.start()

 

posted @ 2019-06-12 23:00  saber゛  Views(157)  Comments(0Edit  收藏  举报