在运行TwistedWeb服务器时,人们使用什么技术来使用多个处理器/核心?有推荐的方法吗?
我的基于twisted.web的Web服务在Amazon EC2实例上运行,该实例通常具有多个CPU核心(8,16),并且该服务所做的工作类型受益于额外的处理能力,所以我非常想使用那.
据我所知,可以在多个Twisted实例的前面使用haproxy,squid或配置为反向代理的Web服务器.实际上,我们目前正在使用这样的设置,nginx用作在同一主机上运行的几个上游twisted.web服务的反向代理,但每个服务在不同的端口上.
这工作正常,但我真正感兴趣的是,没有"前置"服务器的解决方案,但所有扭曲的进程以某种方式绑定到同一个套接字并接受请求.这样的事情甚至可能......还是我疯了?操作系统是Linux(CentOS).
谢谢.
安东.
在我对websockets的持续好奇心中,我注意到了一个趋势:
至少在目前,websocket宇宙的"hello world"似乎是"回声"功能.也就是说,演示的应用程序通常是"我送东西,我收到的东西."
虽然恰当地证明了协议是有用的,但这个例子实际上只展示了传统请求/响应周期所能实现的相同类型的通信.
例如,我可以找到twisted.web.websockets的唯一演示(在服务器端)如下:
import sys
from twisted.python import log
from twisted.internet import reactor
from twisted.web.static import File
from twisted.web.websocket import WebSocketHandler, WebSocketSite
class Echohandler(WebSocketHandler):
def frameReceived(self, frame):
log.msg("Received frame '%s'" % frame)
self.transport.write(frame + "\n")
def main():
log.startLogging(sys.stdout)
root = File(".")
site = WebSocketSite(root)
site.addHandler("/ws/echo", Echohandler)
reactor.listenTCP(8080, site)
reactor.run()
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
我怎样才能在这里检查"推送"功能?也就是说,我如何让Web套接字保持打开状态,然后在某个时间由某些事件的发生决定,通过websocket发送消息,其内容也受此事件的影响?
(那些对这个问题感兴趣的人也可能会认为这个问题引起了我几天前提出的问题:使用websockets和python/django进行移动(/ twisted?))
这是我在使用Twisted.web时遇到的烦人问题.基本上,我有一个继承的类,twisted.web.resource.Resource
并为Mako模板添加了一些默认的东西:
from twisted.web.resource import Resource
from mako.lookup import TemplateLookup
from project.session import SessionData
from project.security import make_nonce
class Page(Resource):
template = ""
def display(self, request, **kwargs):
session = SessionData(request.getSession())
if self.template:
templates = TemplateLookup(directories=['templates'])
template = templates.get_template(self.template)
return template.render(user=session.user,
info=session.info,
current_path=request.path,
nonce=make_nonce(session),
**kwargs)
else:
return ""
Run Code Online (Sandbox Code Playgroud)
然后,我把问题缩小到这个小类(我测试过),我写了一个继承自的资源Page
:
class Test(pages.Page):
def render_GET(self, request):
return "<form method='post'><input type='submit'></form>"
def render_POST(self, request):
request.redirect("/test")
request.finish()
Run Code Online (Sandbox Code Playgroud)
我想要注意的是,在所有其他情况下,如果request.finish()
不是函数中的最后一行,那么我会return
紧接着它.
无论如何,我将这个类添加到站点中/test
,当我在那里导航时,我得到一个提交按钮.我点击提交按钮,然后在控制台中我得到:
C:\Python26\lib\site-packages\twisted\web\server.py:200: UserWarning: Warning! request.finish called twice. self.finish() …
我搜索和搜索但似乎无法找到一种方法以任何合理的方式将文件上传到我的twisted.web应用程序.
目前,将文件上载发布到资源会产生一个request.args['file']
变量,即填充了文件内容的列表.我找不到获取有关该文件的任何信息的方法:mime type,filename,filesize(除了只取字符串的长度args['file'][]
)等.
我已经读过twisted.web2在文件上传方面更好.但是我不知道它有多好,或者我如何使用twisted.web2来处理twisted.web应用程序中的文件上传.
有什么建议?这就像疯了一样困扰着我 - 哦,我查看了请求标题,并没有真正找到任何有意义的东西.如何使用Twisted获取有关文件上传的更多元信息?
我怎样才能从请求对象中获取裸HTTP请求?可能吗?
因此,我在几个月前编写了这个扭曲的应用程序,我现在想扩展一个基于Web的用户界面进行配置.
Twisted网站推荐Nevow,但我不确定这是不是一个好选择.他们的网站似乎已经停止了一段时间,他们的启动板页面在半年内没有看到任何更新.这个项目已经死了吗?此外,我已经在twisted-web邮件列表上看到过将Nevow移动到twisted.web的讨论.那么,它仍然被推荐用于新开发项目吗?
另一个想法是使用Django.我还是需要在config-interface中进行用户身份验证和权限,我对它非常熟悉.(我从来没有和Nevow或twisted.web一起工作过)但是这两个世界的界面似乎很难,我只能找到在Twisted中使用WSGI运行Django的例子.
是否还有其他可能在扭曲的基础上拥有光滑的用户界面?
我已经编写了一个基本的tcp服务器工厂,服务器客户端和使用twisted的服务.tcp服务器充当django服务器和另一个程序之间的中间件(让我们称之为客户端程序).
我想要实现的目标 -
1. 客户端请求中间件 tcp服务器;
2.it发送一个字符串作为请求体;
3. 中间件 tcp服务器反序列化请求中的信息.
4. 中间件将序列化信息进一步发送到django服务器.
5.然后,django服务器响应中间件服务器,该服务器在序列化响应后进一步响应客户端.
我能够到达第3步,但无法向django服务器发出任何http请求.
以下是我的middleware.py
from twisted.internet.protocol import ServerFactory
from twisted.internet.protocol import Protocol
from test_service import MyService
class TCPServerProtocol(Protocol):
data = ''
def connectionMade(self):
self.deferred = self.factory.service.deferred
self.deferred.addCallback(self.factory.service.s)
self.deferred.addCallback(self.transport.write)
self.deferred.addBoth(lambda r: self.transport.loseConnection)
def dataReceived(self, data):
self.data += data
def connectionLost(self, reason):
self.forward(self.data)
def forward(self, data):
if self.deferred is not None:
d, self.deferred = self.deferred, None
d.callback(data) …
Run Code Online (Sandbox Code Playgroud) 在异步环境中,threading.local
不再保证是上下文本地的,因为几个上下文可以在单个线程中共存.大多数异步框架(gevent,eventlet)提供了get_current_context()
识别当前上下文的功能.有些提供了一种猴子补丁的方式,threading.local
因此它是"greenthreads"或其他特定于框架的上下文的本地.我在扭曲的文档中找不到这样的功能.我该怎么做呢?
有一些方法可以从基于Twisted的Web应用程序的响应中删除HTTP Header'Server:TwistedWeb/13.1.0'吗?
我有2个centos 7.1节点,我正试图让flocker运行它.我已完全按照安装步骤操作,但是在运行以下命令时要测试flocker-docker-plugin是否有效:
docker run -v apples:/data --volume-driver flocker busybox sh -c "echo hello > /data/file.txt"
我收到错误:
Error response from daemon: Error looking up volume plugin flocker: Plugin not found
flocker-docker-plugin日志显示以下内容:
{"request_body": null, "url": "https://foo.bar.com:4523/v1/state/nodes/by_era/b72bb203-b174-4241-a03a-6171cbc10f30", "timestamp": 1451201332.659948, "action_status": "started", "task_uuid": "1ae63069-286c-44fa-9dd2-6751ca0efe63", "action_type": "flocker:apiclient:http_request", "method": "GET", "task_level": [1]}
{"task_uuid": "1ae63069-286c-44fa-9dd2-6751ca0efe63", "error": false, "timestamp": 1451201332.749499, "message": "Starting factory <twisted.web.client._HTTP11ClientFactory instance at 0x2fc7710>", "message_type": "twisted:log", "task_level": [3]}
{"exception": "twisted.web._newclient.ResponseNeverReceived", "task_level": [4], "action_type": "flocker:apiclient:http_request", "reason": "[<twisted.python.failure.Failure <class 'OpenSSL.SSL.Error'>>]", "timestamp": 1451201333.050012, "task_uuid": "1ae63069-286c-44fa-9dd2-6751ca0efe63", "action_status": "failed"}
{"task_uuid": …
Run Code Online (Sandbox Code Playgroud) twisted.web ×10
python ×7
twisted ×7
comet ×1
django ×1
docker ×1
http-headers ×1
nevow ×1
python-2.7 ×1
ssl ×1
tcpserver ×1
websocket ×1