本文共 2183 字,大约阅读时间需要 7 分钟。
在多进程编程中,进程间通信是实现程序运行的重要环节。Python提供了多种进程间通信的方式,其中Queue(队列)是一种多进程安全的队列,适用于多个进程之间进行数据传递。
Queue支持两种操作:put(插入数据)和get(读取数据)。这两种操作都具有两个可选参数:blocked和timeout。
put方法用于将数据插入队列中。该方法的两个可选参数如下:
blocked(默认值为True):如果设置为True且timeout为正值,方法会阻塞指定的时间,直到队列有空余空间。如果在等待时间内没有空间可用,则会抛出Queue.Full异常。timeout(默认值为None):如果设置为正值,方法会在指定时间后抛出Queue.Empty异常。如果blocked为False,且队列已满,则会立即抛出Queue.Full异常。get方法用于从队列中读取并删除一个元素。该方法的两个可选参数如下:
blocked(默认值为True):如果设置为True且timeout为正值,方法会阻塞指定的时间,等待队列中有数据可读。如果在等待时间内没有数据可读,则会抛出Queue.Empty异常。timeout(默认值为None):如果设置为正值,方法会在指定时间后抛出Queue.Empty异常。如果blocked为False,则会在没有数据时立即抛出Queue.Empty异常。以下是一个典型示例,展示了如何在多个进程之间使用Queue进行数据传递:
# -*- coding: utf-8 -*-from multiprocessing import Process, Queueimport os, time, randomdef proce_write(q, urls): print("Process (%s) is writing..." % os.getpid()) for url in urls: q.put(url) print("Put %s to queue..." % url) time.sleep(random.random())def proc_read(q): print('Process (%s) is reading...' % os.getpid()) while True: url = q.get(True) print('Get %s from queue.' % url)if __name__ == "__main__": q = Queue() proc_writer1 = Process(target=proce_write, args=(q, ['url_1', 'url_2', 'url_3'])) proc_writer2 = Process(target=proce_write, args=(q, ['url_4', 'url_5', 'url_6'])) proc_reader = Process(target=proc_read, args=(q,)) proc_writer1.start() proc_writer2.start() proc_reader.start() proc_writer1.join() proc_writer2.join() proc_reader.terminate() 运行上述代码可以观察到以下输出:
Process (12204) is writing...Put url_1 to queue...Process (12724) is writing...Put url_4 to queue...Process (5484) is reading...Get url_1 from queue.Get url_4 from queue.Process (12204) is writing...Put url_2 to queue...Get url_2 from queue.Process (12724) is writing...Put url_5 to queue...Get url_5 from queue.Process (12204) is writing...Put url_3 to queue...Get url_3 from queue.Process (12724) is writing...Put url_6 to queue...Get url_6 from queue.Process finished with exit code 0
通过上述示例可以看出,Queue是一种高效的进程间通信工具,能够在多个进程之间安全地传递数据。其put和get方法提供了灵活的阻塞和超时控制选项,适用于不同的应用场景。在实际应用中,可以根据具体需求选择合适的blocked和timeout参数,确保进程间的通信更加高效和可靠。
转载地址:http://biofk.baihongyu.com/