我正在通过可能的架构解决问题。在尽可能少的文字中,问题是:我需要设计一个系统,允许客户端使用HTTP / REST连接以启动长时间运行的进程。每个进程都将创建与第三方服务器的持久连接,并将接收到的数据写入队列。仅当第三方服务器关闭连接或收到另一个HTTP / REST请求指示应终止连接时,每个进程才会终止。
约束和背景:
我是一个较低级别的C人(具有足够的Python经验,感觉很有能力)但是试图围绕可用于使这更容易的Python框架。我的直觉是跳进杂草中,我知道如果我实现这个,就像我想的那样,我不妨把它写在C.不要那样。我想尽可能多地利用Python的框架和库。绩效不是首要任务。
方法我考虑过:
在进行研究时,我遇到了 Twisted 这可能是合适的,似乎对我有意义(将其视为守护进程)。我想象最终产品将是一个Twisted应用程序,它公开一个REST接口,为每个收到的客户端请求调度连接到第三方服务的新线程,并管理自己的线程池。我熟悉线程,但事实上我们还没有用Python完成任何事情。简而言之,扭曲 looks very cool,尽管最后,我还想知道我是否过于复杂。
我考虑的第二种方法是使用 Celery和Flask ,简单地让Celery处理所有调度,线程管理等。我发现这篇文章显示Celery and Flask很好地在一起玩。这似乎是一种更简单的方法。
写完这篇文章后,我倾向于使用Celery和Flask的第二种选择,虽然我对Celery一无所知,所以寻找你可能有的任何建议,以及其他可能的架构我不考虑。我非常感谢,并提前感谢你。
答案 0 :(得分:0)
是的,Twisted在这里太过分了。
根据您的描述,Celery和Flask的组合就足够了。它将允许您实现一个REST接口,该接口将您长时间运行的进程作为Celery任务启动。您可以轻松实现REST方法,允许客户端通过在任务ID上调用Celery的撤销方法来停止运行任务。请注意,Celery依赖于Message Broker来发送和接收消息(通常使用RabbitMQ)以及用于存储结果的数据后端(通常使用Redis)。
>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)
http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks