我需要一个生产者-消费者类型的体系结构,生产者将数据一次又一次地放入队列中,然后消费者以处理数据的速度从该队列中读取数据。
对于在不同进程中运行的生产者和消费者,我们已经有了multiprocessing
,Queue
,其中有put
和get
。因此,即使生产者的运行速度是消费者的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。
这并不是说不可能创建自定义套接字或服务器实现来实现这一点。。。但是,在编程的很多时候,最好不要试图重建轮子。