python中网络上的生产者-消费者体系结构



我需要一个生产者-消费者类型的体系结构,生产者将数据一次又一次地放入队列中,然后消费者以处理数据的速度从该队列中读取数据。

对于在不同进程中运行的生产者和消费者,我们已经有了multiprocessingQueue,其中有putget。因此,即使生产者的运行速度是消费者的2-3倍,所有数据都在队列中(假设内存使用不是问题(,消费者只要需要就调用q.get

但我需要生产者和消费者通过网络连接,所以插座可能很难(但我对其他方法持开放态度(。套接字的最大问题是它们不能像队列那样自动分离对象

对于multiprocessing.Queue,如果我调用q.get,我会得到下一个对象,队列会负责读取多少字节,并为我重新创建对象,q.get只返回对象。对于套接字,我必须pickle.dumps才能发送它,然后我需要小心从套接字读取多少字节(如果套接字中有多个对象(,然后pickle.loads才是结果。主要问题是跟踪对象的大小。

如果我在一个Queue中放入10个不同大小的对象,加起来有1000个字节,那么队列会在调用q.get时为每个对象读取多少字节。对于一个套接字,如果我抓取10个对象并发送它们,套接字不知道如何拆分其中的1000字节大字符串,为此创建一个机制意味着添加大量新代码。

有什么。。。基于套接字的Queue或类似产品?

这通常通过一个外部软件来解决,该软件将作为生产者和消费者在互联网上的代理。有一些开源项目你可以研究;

  • RabbitMQ
  • 卡夫卡
  • Redis
  • 芹菜

它们都有自己的不同之处,但它们都有Python库,您可以轻松地pip install开始使用它们。所有这些都需要运行第三个进程来充当消息的代理。

同样,也有付费产品,通常托管在大型云提供商之一,如AWS SQS。

这并不是说不可能创建自定义套接字或服务器实现来实现这一点。。。但是,在编程的很多时候,最好不要试图重建轮子。

最新更新