进程间通信

参考博客:http://blog.csdn.net/HeatDeath/article/details/72844120

一、前言

  线程存在于进程中,对于同一个进程内的线程,该进程内的资源是共享的,各个线程可以竞争获取。而不同的进程有独立的内存空间,它们之间不能直接相互访问,那么进程和进程间如何相互通信呢?

二、进程间通信

  2.1 Queue()

  在线程中有个队列queue,典型的应用在生产者和消费者模型中。而Queue()则用于进程间通信,使用和线程queue差不多。  

from multiprocessing import Process, Queue
import os
import time
import random


# 写数据进程执行的代码:
def write(x):
    print('Process to write: %s' % os.getpid())
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        x.put(value)
        time.sleep(random.random())


# 读数据进程执行的代码:
def read(x):
    print('Process to read: %s' % os.getpid())
    while True:
        value = x.get()
        print('Get %s from queue.' % value)


if __name__ == '__main__':
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()
    # 启动子进程pr,读取:
    pr.start()
    # 等待pw结束:
    pw.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    pr.terminate()

  2.2 Pipe()

  Pipe()函数返回一对由管道连接的连接对象,默认情况下是双工(双向)。

  Pipe()返回的两个连接对象代表管道的两端。 每个连接对象都有send()和recv()方法(等等) 

rom multiprocessing import Process, Pipe


def f(conn):
    conn.send([1, 2, 3])  # 子进程发送
    while True:
        print('receive from parent process:', conn.recv())   # 子进程接收

if __name__ == '__main__':
    parent_conn, child_conn = Pipe()   # 定义连接对象
    p = Process(target=f, args=(child_conn,))
    p.start()
    print('receive from child process:', parent_conn.recv())
    parent_conn.send('123')
    p.terminate()


# 输出
receive from child process: [1, 2, 3]
receive from parent process: 123

  

posted @ 2017-12-07 14:39  Bigberg  阅读(289)  评论(0编辑  收藏  举报