Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用REST接口构建多线程应用程序_Python_Rest_Architecture_Celery_Twisted - Fatal编程技术网

Python 使用REST接口构建多线程应用程序

Python 使用REST接口构建多线程应用程序,python,rest,architecture,celery,twisted,Python,Rest,Architecture,Celery,Twisted,我正在研究一个问题的可能架构。简单地说,问题是:我需要设计一个系统,允许客户端使用HTTP/REST进行连接,以启动长时间运行的进程。每个进程将创建到第三方服务器的持久连接,并将接收到的数据写入队列。只有当第三方服务器关闭连接或收到另一个HTTP/REST请求指示应该终止时,每个进程才会终止 限制和背景: 客户端必须能够使用HTTP/REST进行连接 系统必须用Python编写 我是一个C级别较低的人,有足够的Python经验让我感觉自己很有能力,但我试图用Python框架来简化这一过程。我的直

我正在研究一个问题的可能架构。简单地说,问题是:我需要设计一个系统,允许客户端使用HTTP/REST进行连接,以启动长时间运行的进程。每个进程将创建到第三方服务器的持久连接,并将接收到的数据写入队列。只有当第三方服务器关闭连接或收到另一个HTTP/REST请求指示应该终止时,每个进程才会终止

限制和背景:

客户端必须能够使用HTTP/REST进行连接 系统必须用Python编写 我是一个C级别较低的人,有足够的Python经验让我感觉自己很有能力,但我试图用Python框架来简化这一过程。我的直觉是跳进杂草里,我知道如果我按照我的想法来实现它,我还不如用C来写。我不想那样。我想利用尽可能多的Python框架和库。性能不是头等大事

我考虑过的方法:

在做研究的过程中,我遇到了Twisted,这可能是一个合适的方法,并且对于我来说,把它看作一个守护进程似乎是有意义的。我设想最终的产品将是一个Twisted应用程序,它公开一个REST接口,为收到的每个客户端请求分派连接到第三方服务的新线程,并管理自己的线程池。我对线程很熟悉,但无可否认,我还没有在Python中使用它们做过任何事情。总而言之,扭曲了,但最后,我想知道我是否把这件事复杂化了

我考虑的第二种方法是使用芹菜和烧瓶,简单地让芹菜处理所有的调度、线程管理等。我发现这篇文章很好地展示了如何协同工作。这似乎是一种更简单的方法


在写了这篇文章之后,我倾向于使用芹菜和烧瓶的第二种选择,尽管我对芹菜知之甚少,所以我希望您能提供一些建议,以及我没有考虑的其他可能的架构。我真的很感激,并提前向您表示感谢。

是的,Twisted在这里太过分了

根据你的描述,芹菜和烧瓶的组合就足够了。它将允许您实现一个REST接口,将长时间运行的流程作为芹菜任务启动。通过对任务ID调用Celery的revoke方法,您可以轻松实现REST方法,从而允许客户端停止运行任务。请注意,Celery依赖于Message Broker来频繁发送和接收消息,RabbitMQ被使用,而数据后端用于频繁存储结果Redis被使用

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

主持人:什么?虽然我理解基于意见的问题,比如什么语言更适合C或Java?或者我应该把花括号放在哪里?对于堆栈溢出,我没有立足之地,我强烈反对这个问题的观点,这个问题提出了一个关于软件体系结构的合理问题,属于基于观点的问题范畴。