量子站点的多线程和多处理问题

use*_*747 5 python python-multithreading flask pythonanywhere python-multiprocessing

我开始勾勒出用Python编写的量化金融信息服务网站的结构(3.x我希望)并得出结论 - 纠正我,如果我错了 - 我要去必须同时使用eventlet网络库多处理库.

该系统的一部分基本上是一个在后台运行的cron作业,在市场关闭后检查股票市场和其他财务数据,进行机器学习和定量计算,然后将预测放在一个简单的数据库中,甚至可能是一个平坦的逗号分隔文件.(因此,参数通过文件在系统的各部分之间传递.)

我知道eventlet可以用于非阻塞I/O,这样美丽的汤或scrapy可以同时从多个站点(某种程度上)抓取信息,多处理库可以使机器学习/量化算法进行计算将所有股票数据并行作为单独的流程.

要查看预测,用户将登录使用Flask构建的系统的其他部分,该部分将访问数据库并显示预测.

我假设所有这些库和混合线程/多处理例程彼此相处?我将使用pythonanywhere.com作为主机,它们似乎有相当多的"电池包括在内".当然,当测试完成后,我可能不得不升级"工人"的数量来为最终部署的站点供电.

混合线程和多处理中的任何陷阱都会变得复杂吗?

con*_*rad 2

只是一些不适合评论部分的一般想法:

  1. scrapy已经有一些通过twisted处理并发网络请求的方法。这意味着你可能不需要使用eventlet?当然,这取决于您具体如何进行抓取/您到底需要抓取什么。根据我很久以前的尝试(也许我完全错了),如果你说需要 selenium 来抓取 javascript 响应,那么很难与 scrapy 同时执行此操作。但如果你只是使用 urllib 或其他东西(例如:API)进行 get 请求,那么我认为 scrapy 就足够了。

  2. 我同意你的评论——网络抓取部分总是很容易失败,所以你肯定想将抓取部分与预测部分分开。您需要考虑失败的抓取(例如:如果网站关闭了怎么办,或者如果您收到错误的数据怎么办),并在将清理后的数据填充到您自己的数据库之前清理所有数据,然后(单独)运行该数据的机器学习内容。

但这里一件重要的事情是,您肯定需要在抓取和机器学习之间建立一个数据库(不能像您建议的那样仅在内存中或通过 csv 传递它们)。原因有无数,其中有几个是:

  • 节省您的刮擦(不需要每次都下载多天的数据,只需下载最近一天的数据)
  • 为您提供备份和历史数据,以防您的网络抓取不再可用(例如:假设您正在抓取过去 365 天的数据 - 如果您的信息源只提供过去 365 天的数据,但您突然想要 700 天的数据,该怎么办?您想要已将您之前抓取的数据保存在某处)
  • 更快/更好/更少不稳定 - 拥有正确索引的数据库可能与机器学习算法的任何并行处理一样重要,甚至更重要。

顺便说一句,django 与 scrapy 配合得很好......