花了整整两天的时间后,我仍然发现无法理解Comet in Python的所有选择和配置.我已经阅读了这里的所有答案以及我能找到的每篇博文.感觉我此刻即将出血,所以我对这个问题的任何错误都表示歉意.
我对这一切都是全新的,我之前所做的只是在Apache上使用PHP/Django后端的简单非实时站点.
我的目标是创建一个实时聊天应用程序; 希望绑定到Django的用户,身份验证,模板等.
每当我读到一个工具,它说我需要另一个工具,它感觉就像一个永无止境的链.
首先,任何人都可以对这项工作所需的所有工具进行分类吗?
我已经阅读了有关客户端的不同服务器,网络库,引擎,JavaScripts,我不知道还有什么.我从没想过会是这么复杂.
扭曲 /扭网站似乎是受欢迎的,但我不知道要整合,或什么别的我需要(猜我需要客户端JS至少).
如果我理解正确,Orbited是基于 Twisted 构建的,我还需要其他任何东西吗?
Gevent和Eventlet与Twisted属于同一类别吗?我还需要多少钱?
Celery,RabbitMQ或像Redis这样的KV商店在哪里出现?我真的不明白消息队列的概念.它们是否必不可少,它们提供的服务是什么?
我应该看一下完整的聊天应用教程吗?
我会完全感激任何帮助我度过这个精神障碍的人,如果我遗漏了任何东西,请不要犹豫.我知道这是一个非常有问题的问题.
我正在编写一个需要并发和异步性的Python应用程序.我已经为Twisted和Celery提出了一些建议,但是我无法确定哪个是这个应用程序的更好选择(我没有任何经验).
应用程序(不是Web应用程序)主要围绕向各种第三方API发出SOAP调用.要处理给定的数据,我需要按顺序调用几个API.而且我希望能够为每个API提供一个"工作者"池,这样我就可以一次为每个API拨打多个电话.没有什么关于这应该是非常密集的cpu.
更具体地说,外部进程将向该应用程序的数据库添加新的"消息".我需要一份监视新消息的工作,然后将它们推送到Process.该过程将包含4-5个步骤,这些步骤需要按顺序发生,但可以完全异步发生.每个步骤都将接收消息并以某种方式对其进行操作,通常会向消息添加详细信息.每个后续步骤都需要从其前面的步骤输出.对于大多数这些步骤,所涉及的工作主要围绕通常使用SOAP客户端调用第三方API,解析响应以及更新消息.一些案例将涉及创建二进制文件(如果这是一个因素,则更难腌制).最后,一旦最后一步完成,我将需要更新数据库中的标志,以指示完成此消息的整个过程.
此外,由于每个步骤都涉及等待网络响应,因此我希望通过在每个步骤中同时发出多个请求来提高整体吞吐量.
Celery或Twisted是一个更普遍合适的框架吗?如果他们都能充分解决问题,那么使用一个与另一个是否有利有弊?还有什么我应该考虑的吗?
我试图弄清楚是否存在使用twisted的文件访问的事实模式.我看过的很多例子(twisted.python.log,twisted.persisted.dirdbm,twisted.web.static)实际上并不担心阻止文件访问.
似乎应该有一些明显的接口,可能继承自abstract.FileDescriptor,所有文件访问都应该作为生产者/消费者进行.
我是否遗漏了某些内容,或者仅仅是异步编程中的扭曲主要用于网络并且它还没有真正用于其他文件描述符操作,而不是担心非阻塞IO的纯度?
我不明白这些框架解决了什么问题.它们是Apache HTTPD,Tomcat,Mongrel等HTTP服务器的替代品吗?或者他们更多?为什么我可以使用它们......一些现实世界的例子?我已经看到了无数的聊天室和广播服务的例子,但是看不出这有什么不同,例如,设置一个Java程序来打开套接字并为每个请求分配一个线程.
我想我理解非阻塞I/O,但我不明白它与多线程Web服务器的区别.对于Node.js,我读到它只有一个线程,并且这可能比处理多个线程更有效,但这是这些框架和传统Web服务器之间的唯一区别吗?
所述扭曲扩展系统 是写扩展的扭曲应用的首选方式.
但是,由于插件系统的结构方式(插件进入一个不应该是Python包的twisted/plugins目录),编写适当的setup.py来安装这些插件似乎并非易事.
我已经看到一些尝试将'twisted.plugins'添加到distutils setup命令的'packages'键,但由于它不是真正的包,所以会发生不好的事情(例如,__init__.py某些工具有助于添加).
其他尝试似乎使用'package_data'(例如,http://bazaar.launchpad.net/~glyph/divmod.org/trunk/view/head: /Epsilon/epsilon/setuphelper.py),但这也可能失败以奇怪的方式.
问题是:有没有人成功编写过setup.py来安装扭曲的插件,它适用于所有情况?
我在Eclipse中设置了运行配置,需要将SIGINT(Ctrl+ C)发送到程序.在SIGINT之后运行的程序中有清理代码,因此按下Eclipse的"终止"按钮将不起作用(我认为它们发送SIGKILL).在控制台中键入CTRL+ C也不起作用.
如何将SIGINT发送到在Eclipse控制台内运行的进程?
(FWIW我正在运行Twisted守护程序并且需要Twisted才能正确关闭,这只发生在SIGINT上)
有没有办法阻止Twisted reactor自动吞咽异常(例如NameError)?我只是想让它停止执行,并在控制台中给我一个堆栈跟踪?
甚至有关于它的FAQ 问题,但至少可以说,它不是很有用.
目前,在每个错误中我都这样做:
def errback(value):
import traceback
trace = traceback.format_exc()
# rest of the errback...
Run Code Online (Sandbox Code Playgroud)
但这感觉很笨重,还有更好的方法吗?
为了回应Jean-Paul的回答,我尝试运行以下代码(使用Twisted 11.1和12.0):
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.internet import protocol, reactor
class Broken(protocol.Protocol):
def connectionMade(self):
buggy_user_code()
e = TCP4ClientEndpoint(reactor, "127.0.0.1", 22)
f = protocol.Factory()
f.protocol = Broken
e.connect(f)
reactor.run()
Run Code Online (Sandbox Code Playgroud)
运行后,它只是挂在那里,所以我必须按Ctrl-C它:
> python2.7 tx-example.py
^CUnhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
Failure: twisted.internet.error.ConnectionRefusedError: Connection was refused by other side: 111: Connection refused.
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法,通过连接到TCP端口的所有客户端定期发送一些数据.我正在看扭曲的python,我知道reactor.callLater.但是如何使用它定期向所有连接的客户端发送一些数据呢?数据发送逻辑在Protocol类中,并且根据需要由反应器实例化.我不知道如何将它从反应堆绑定到所有协议实例......
我有一个项目,我正在使用Twisted作为我的Web服务器.当发生异常(例如网络错误)时,它会打印到控制台.
我已经记录了Python的内置日志模块 - 有没有办法告诉反应堆使用它?
通常的模式是什么?
我将在Python中实现Comet(尽管我听到了关于erlycomet的好消息,但我对于支持基于Erlang的Web服务器以及后端的其他内容并不感到激动).我发现了几种可能性:
(还有一些与Java服务器接口的其他选择,但我对那些不感兴趣)
考虑到性能,社区和易于实施,有人可以在这些实现中提出建议吗?
twisted ×10
python ×9
comet ×2
celery ×1
concurrency ×1
distribute ×1
distutils ×1
django ×1
eclipse ×1
eventmachine ×1
gevent ×1
node.js ×1
nonblocking ×1
protocols ×1
setuptools ×1
sigint ×1
soap ×1
tcp ×1
tornado ×1