博客
关于我
python 多进程-进阶-进程间通信之Queue
阅读量:795 次
发布时间:2023-03-07

本文共 2183 字,大约阅读时间需要 7 分钟。

Python多进程通信:Queue实现多进程间数据传递

在多进程编程中,进程间通信是实现程序运行的重要环节。Python提供了多种进程间通信的方式,其中Queue(队列)是一种多进程安全的队列,适用于多个进程之间进行数据传递。

Queue的基本使用

Queue支持两种操作:put(插入数据)和get(读取数据)。这两种操作都具有两个可选参数:blockedtimeout

Put方法

put方法用于将数据插入队列中。该方法的两个可选参数如下:

  • blocked(默认值为True):如果设置为True且timeout为正值,方法会阻塞指定的时间,直到队列有空余空间。如果在等待时间内没有空间可用,则会抛出Queue.Full异常。
  • timeout(默认值为None):如果设置为正值,方法会在指定时间后抛出Queue.Empty异常。如果blocked为False,且队列已满,则会立即抛出Queue.Full异常。

Get方法

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是一种高效的进程间通信工具,能够在多个进程之间安全地传递数据。其putget方法提供了灵活的阻塞和超时控制选项,适用于不同的应用场景。在实际应用中,可以根据具体需求选择合适的blockedtimeout参数,确保进程间的通信更加高效和可靠。

转载地址:http://biofk.baihongyu.com/

你可能感兴趣的文章
python | pytime,一个实用的 时间和日期处理 Python 库!
查看>>
python | pyupgrade,一个有趣的 Python 库!
查看>>
python | pyvips,一个神奇的 图像处理 Python 库
查看>>
Python | qutip,一个高级的 Python 库!
查看>>
python | rapidjson,一个实用的 提高JSON处理效率 Python 库!
查看>>
python | reflex,一个无敌的 Python 库!
查看>>
python | reloading,一个强大的 Python 库!
查看>>
python | rich,一个无敌的 Python 库!
查看>>
python | rlax,一个超强的 强化学习领域 Python 库!
查看>>
python | rpyc,一个超实用的 Python 库!
查看>>
python | rq,一个无敌的 关于Redis 的Python 库!
查看>>
python读取字符串指定位置字符_python要怎么截取指定位置的字符串呢?
查看>>
python | scikit-llm,一个神奇的 Python 库!
查看>>
python | sentry,一个超酷的 关于错误监控工具 Python 库!
查看>>
python | shiv,一个超酷的 打包工具 Python 库!
查看>>
python | six,一个神奇的 Python 库!
查看>>
Python读取图片的几种方法供net使用
查看>>
python | spacy,一个神奇的 Python 库!
查看>>
python | sqlmap,一个实用的 Python 库!
查看>>
python | sumy,一个超酷的 用于文本摘要的 Python 库!
查看>>