Python(进程间通信)

1. 队列

import multiprocessing
# 线程通信=====(队列) ---- from queue import Queue
# 进程池中进程通信=====(队列) --- from multiprocess.Manager import Queue
# 多进程通信=====(队列) ---- from multiprocess import Queue
import time
class Producer(multiprocessing.Process):
    def __init__(self, queue):
        super(Producer, self).__init__()
        self.queue = queue
    def run(self):
        # 将需要通信的数据写入队列中;
        for i in range(10):
            self.queue.put(i)
            time.sleep(0.1)
            print("传递消息, 内容为%s" %(i))
class Consumer(multiprocessing.Process):
    def __init__(self, queue):
        super(Consumer, self).__init__()
        self.queue = queue
    def run(self):
        while True:
            time.sleep(0.1)
            recvData = self.queue.get()
            print("接受到另一进程传递的数据: %s" %(recvData))

if __name__ == '__main__':
    q =  multiprocessing.Queue()
    p1 = Producer(q)
    c1 = Consumer(q)

    p1.start()
    c1.start()
    p1.join()
    c1.join()

2. 管道

2.1 什么是管道:
		Pipe管道,进程间通信的方式, 类似于Linux命令中的"|"( ls | wc -l);
		Pipe()返回两个连接对象, 分别代表管道的两边;
		管道通信操作的方法: send(), recv();
		管道间的通信是双向的, 既可以发送,也可以接收;
		
2.2 实现代码:
import multiprocessing
import Queue
import time

def after(conn):
    while True:
    	# 管道一端接收数据
        print("接收到数据:", conn.recv())
        time.sleep(1)

def before(conn):
    while True:
        data = [42, None, 34, 'hello']
        # 管道一端发送数据
        conn.send(data)
        print("正在发送数据:%s" % (data))
        time.sleep(1)

def main():
	# 实例化一个管道, before_conn, after_conn用来表示管道两端
    before_conn, after_conn = multiprocessing.Pipe()
	# 当先执行接收时,由于此时管道内并未传输数据,所以after函数会等待before函数向管道内传入数据后运行
    p1 = multiprocessing.Process(target=after, args=(after_conn,))
    p1.start()

    p2 = multiprocessing.Process(target=before, args=(before_conn,))
    p2.start()

    p1.join()
    p2.join()

if __name__ == '__main__':
    main()

猜你喜欢

转载自blog.csdn.net/qq_43281189/article/details/86602980