1. 进程之间交换对象

python-parallel-programming-cookbook-cn 如何在进程之间交换对象

并行应用常常需要在进程之间交换数据。

Multiprocessing库有两个Communication Channel可以交换对象:队列(queue)管道(pipe)

1.1. 使用队列交换对象

可以通过队列数据结构来共享对象。

Queue 返回一个进程共享的队列,是线程安全的,也是进程安全的。任何可序列化的对象(Python通过 pickable 模块序列化对象)都可以通过它进行交换。

例如:使用队列来实现生产者-消费者问题。 Producer 类生产item放到队列中,然后 Consumer 类从队列中移除它们。

#!/usr/bin/python3
#!--*-- coding:utf-8 --*--
import multiprocessing
import random
import time

class Producer(multiprocessing.Process):
    def __init__(self, queue):
        multiprocessing.Process.__init__(self)
        self.queue = queue

    def run(self):
        for i in range(10):
            item = random.randint(0, 256)
            self.queue.put(item)
            print("Process Producer : item %d appended to queue %s" % (item, self.name))
            time.sleep(1)
            print("The size of queue is %s" % self.queue.qsize())

            
class Consumer(multiprocessing.Process):
    def __init__(self, queue):
        multiprocessing.Process.__init__(self)
        self.queue = queue

    def run(self):
        while True:
            if self.queue.empty():
                print("the queue is empty")
                break
            else:
                time.sleep(2)
                item = self.queue.get()
                print('Process Consumer : item %d popped from by %s \n' % (item, self.name))
                time.sleep(1)

                
if __name__ == '__main__':
    queue = multiprocessing.Queue() #主程序中创建 Queue 实例
    process_producer = Producer(queue)  #创建生产者进程
    process_consumer = Consumer(queue)  #创建消费者进程
    process_producer.start()
    process_consumer.start()
    process_producer.join()
    process_consumer.join()
Last modification:June 10th, 2022 at 04:58 pm