Tag: 龙卷风

如何在python Tornado服务器的请求中执行多处理?

我正在使用I / O非阻塞python服务器Tornado。 我有一类GET请求可能需要大量的时间才能完成(想想在5-10秒的范围内)。 问题在于Tornado阻塞了这些请求,以便后续的快速请求被保留,直到缓慢的请求完成。 我看着: https : //github.com/facebook/tornado/wiki/Threading-and-concurrency ,得出结论,我想#3(其他进程)和#4(其他线程)的组合。 #4自己有问题,而当另一个线程正在进行“重型升降”时,我无法得到可靠的控制回到ioloop。 (我认为这是由于GIL和重负载任务具有高CPU负载,并保持远离主Ioloop的控制的事实,但这是一个猜测)。 所以我一直在做原型devise,通过在一个单独的进程中在这些缓慢的GET请求中完成“繁重的任务”,然后在完成请求的过程中将callback放回到Tornado ioloop中。 这释放了ioloop来处理其他请求。 我已经创build了一个简单的例子来演示一个可能的解决scheme,但是很好奇从社区那里得到反馈。 我的问题有两方面:如何简化现行的方法? 它可能存在哪些缺陷? 该方法 利用Tornado内置的asynchronous装饰器,允许请求保持打开状态,并继续使用ioloop。 使用python的multiprocessing模块为“繁重”任务生成一个单独的进程。 我第一次尝试使用threading模块,但无法得到任何可靠的控制权交给ioloop。 多核处理似乎也会利用多核。 在主Ioloop进程中使用正在监视multiprocessing.Queue处理的threading模块启动一个“观察者”线程。当完成时,“繁重”任务的结果将会被调用。 这是需要的,因为我需要一种方式来知道重载任务已经完成,同时还能够通知ioloop这个请求已经完成。 确保“监视器”线程经常使用time.sleep time.sleep(0)调用将控制权交给主Ioloop循环,以便继续处理其他请求。 当队列中存在结果时,使用tornado.ioloop.IOLoop.instance().add_callback()从“观察者”线程添加一个callbacktornado.ioloop.IOLoop.instance().add_callback() ,该函数被logging为从其他线程调用ioloop实例的唯一安全方法。 一定要在callback中调用finish()来完成请求并提交回复。 下面是显示这种方法的一些示例代码。 multi_tornado.py是实现上述大纲的服务器, call_multi.py是一个示例脚本,它以两种不同的方式调用服务器来testing服务器。 两个testing都使用3个慢速GET请求和20个快速GET请求来调用服务器。 在打开和closures线程的情况下都显示结果。 在使用“无线程”运行的情况下,3个缓慢的请求块(每个都需要一秒多的时间才能完成)。 20个快速请求中的一些挤入了ioloop中的一些缓慢请求之间(并不完全确定这是怎么发生的,但可能是我在同一台机器上同时运行服务器和客户端testing脚本的工件)。 这里的要点是,所有的快速请求都受到不同程度的影响。 在使用线程运行的情况下,20个快速请求全部首先立即完成,然后三个慢速请求几乎在同一时间完成,因为它们各自并行运行。 这是所需的行为。 三个缓慢的请求需要2.5秒才能并行完成 – 而在非线程的情况下,三个缓慢的请求总共花费约3.5秒。 所以整体上大概有35%的速度(我认为是由于多核共享)。 但更重要的是 – 快速的请求立即在缓慢的请求中处理。 我没有很多的multithreading编程经验 – 所以虽然这似乎在这里工作,我很好奇学习: 有一个更简单的方法来完成这个吗? 在这种方法中可能会潜伏什么? (注意:未来的折衷可能是运行更多的Tornado实例,并使用像nginx这样的反向代理来进行负载均衡,无论我将使用负载均衡器运行多个实例 – 但是我只关心在这个问题上抛硬件因为看起来硬件在阻塞方面与问题直接相关)。 […]

如何使Tornado中的SQLAlchemy成为asynchronous?

如何使Tornado SQLAlchemy成为async ? 我在MongoDB上find了asynchronousmongo例子的例子,但是我找不到像SQLAlchemy这样的motor 。 有谁知道如何使SQLAlchemy查询执行与tornado.gen (我正在使用MySQL下面的SQLAlchemy ,目前我的处理程序读取数据库和返回结果,我想使这个asynchronous)。

龙卷风替代Django还是互补?

我有几个关于Tornado和其他Web框架的问题。 1)龙卷风声称是一个networking服务器(一个非阻塞的,因此性能很高),所以有人说它不扮演django –ie的angular色,他们说龙卷风不是一个web框架。 但是,它确实提供了一个我认为是networking框架( http://www.tornadoweb.org/documentation#main-modules ) – 这样,它似乎将djangoreplace为Web开发框架。 我的上述理解是否正确? 2)通常,在Nginx后面build立了几个Tornados。 Tomcat通常也build立在Apache Web服务器之后。 我可以说龙卷风扮演完全相同的angular色Tomcat的Javanetworking服务器? 如果答案是肯定的,那么Tornado就是一个Web框架。 3)我看了一些文章说,一起使用Tornado和Django,比如http://www.jeremybowers.com/blog/post/3/on-deploying-tornado-web-server-framework/ ,但是我在网上看了一些文章声称“如果你使用Django,那么你失去了Tornado的asynchronous”,这是真的还是假? 一个相关的问题,但是如果Tornado本身就是一个web框架,就像我在1)中说的那样,为什么人们会根本就使用Django呢? (导致插件?) 有人能给我一个101介绍吗?

龙卷风403打开websocket时发出警告

我发现这个python脚本应该让我打开一个WebSocket。 然而,当我尝试打开实际的WebSocket(使用Old WebSocket Terminal Chrome插件)时,我收到警告[W 1402720 14:44:35 web:1811] 403 GET / (192.168.0.102) 11.02 ms 。 terminal窗口不会打印“连接打开”,“连接closures”和“收到消息”消息。 import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import tornado.websocket class MyHandler(tornado.websocket.WebSocketHandler): def open(self): print "connection opened" self.write_message("connection opened") def on_close(self): print "connection closed" def on_message(self,message): print "Message received: {}".format(message) self.write_message("message received") if __name__ == "__main__": tornado.options.parse_command_line() app = […]

一起使用烧瓶和龙卷风?

我是Flask的忠实粉丝 – 部分原因是它很简单,部分原因是因为它有很多扩展 。 然而,Flask是为了在WSGI环境中使用,WSGI不是非阻塞的,所以(我相信)对于某些types的应用程序来说,它不能像Tornado那样扩展。 由于每个人都有一个URL调度器将调用一个函数,都将使用Python文件(在Django中,你不启动python文件,但在烧瓶或龙卷风你做)是否有意义,有两个单独的部分到您的网站 – 一部分是用Tornado运行非阻塞作业,另一部分是用Flask写的? 如果这是一个好主意,你会怎么去分享Flask和Tornado之间的cookies /会话? 我会遇到问题,因为烧瓶将使用自己的系统,龙卷风将使用自己的系统?

何时以及如何使用Tornado? 什么时候没用?

好吧,龙卷风是非阻塞的,速度相当快,它可以很容易地处理很多站立要求。 但我猜这不是一个银弹,如果我们只是盲目地运行基于Django或其他网站与龙卷风,它不会给任何性能提升。 我找不到全面的解释,所以我在这里问: 什么时候应该使用龙卷风? 什么时候没用? 使用时应该考虑什么? 我们怎样才能使低迷的网站使用龙卷风? 有一个服务器和一个networking框架。 我们什么时候应该使用框架,什么时候可以用另一个replace?

node.js和Tornado之间的区别

除了node.js是用Python和Tornado编写的,这两者之间有什么区别呢? 他们都是非阻塞asynchronousWeb服务器,对不对? 为什么select除了语言之外呢?

JSON劫持在现代浏览器中仍然是个问题吗?

我正在使用Backbone.js和Tornado Web服务器。 在Backbone中接收集合数据的标准行为是作为JSON数组发送。 另一方面,由于以下漏洞,Tornado的标准行为是不允许JSON Array: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx 相关的是: http : //haacked.com/archive/2009/06/25/json-hijacking.aspx 对于我来说,当它真的是一个对象列表的时候,不必把我的JSON包装在一个对象中就更自然了。 我无法在现代浏览器(即当前的Chrome,Firefox,Safari和IE9)中再现这些攻击。 同时,我无法确认现代浏览器已经解决了这些问题的任何地方。 为了确保我不会被任何可能的糟糕的编程技巧或不良的Googlesearch技巧误导: 这些JSON劫持攻击今天在现代浏览器中仍然是个问题吗? (注意:对于可能的重复对不起, 现在的浏览器有可能做'JSON劫持'吗?但是由于接受的答案似乎没有回答这个问题 – 我想是时候再问一遍,得到一些更清楚的解释。)

何时使用Tornado,何时使用Twisted / Cyclone / GEvent /其他

哪个框架/库将成为构build现代多用户Web应用程序的最佳select? 我很想有一个asynchronous的networking服务器,这将允许我轻松地扩展。 什么解决scheme会提供最好的性能 / 可扩展性 / 最有用的框架 (易于使用和易于开发)? 如果它能提供良好的function (websocket,rpc,streaming等),那将是一件好事。 每个解决scheme的优缺点是什么?