我有几个脚本从多个网站抓取数据。下一步是处理数据。我想设置一个接收数据并处理数据的worker。什么是一个好的管道/工作流方法,让一个工人总是在运行并等待刮刀将数据提供给处理?
我认为类似API服务器来处理请求,但是有更好的解决方案吗?
答案 0 :(得分:1)
如果没有更多细节,我只能提供一般性建议:
如果它们都在同一台机器上运行,并且刮刀和工作程序由同一个进程启动,则可以在标准库中使用multiprocessing.Queue。它应该适用于非常简单的工作流程。
为了获得更大的灵活性,我将使用消息传递库在进程之间进行通信。我喜欢ZeroMQ,但也有其他人。
ZeroMQ支持本地进程间传输和网络传输,您可以在几乎没有代码更改的情况下在传输类型之间进行更改。如果你从multiprocessing.Queue开始,但事实证明你想在不同的机器上运行worker,你将不得不重写很多代码。
刮刀和工人可以直接相互通信(PUSH / PULL模式),或者你可以在它们之间有一个经纪人/队列。
如果你总是只有一个工人PUSH-PULL就足够了,如果你有更多,你会想要一个队列。
PUSH / PULL:每个刮刀与工人交谈并发送工作。刮刀必须轮询每个刮刀进行工作。
队列:刮刀将任务发送到队列。工作人员查询队列的工作。
PUSH / PULL稍微简单一些,但这意味着工作人员必须了解并连接每个刮刀。如果您的工作流程很复杂,它可能会变得混乱。
对于队列,scraper和worker只需知道队列,它就是中央代理。
http://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html
http://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/devices/queue.html